EntityFieldQueryによって返されたエンティティからフィールドを取得する


7

動画コンテンツタイプがあります。で次のクエリを実行しますhook_cron

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node');
$query->entityCondition('bundle', 'video');
$query->propertyCondition('status', 1);
$results = $query->execute();

これは、プロパティを持つエンティティオブジェクトの数を返しnidvidtype。このオブジェクトを使用して、ビデオの特定のフィールド(たとえば、再生時間)の値を検索します。node_loadクエリを使用する代わりに、そもそもを使用していたので、は使用したくありません。これはどのように行うことができますか?

回答:


5

EntityFieldQueryエクストラフィールドモジュールは、あなたの問題を解決することができます。

クエリは、以下に示すように、エンティティID、エンティティタイプを含むオブジェクトと、エンティティタイプ、エンティティID、リビジョンID、バンドル、および要求されたフィールドを含むオブジェクトを返します。あなたのコードは次のようになります:

$query = new EntityFieldQueryExtraFields();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'video')
  ->addExtraField('field_duration', 'value', 'value')
  ->propertyCondition('status', 1);

$results = $query->execute();

現在、このソリューションをサイトで使用しています。


11

できません-はEntityFieldQuery、エンティティIDとバンドルキーのみをロードします。

使用する以外に選択肢はありませんnode_load_multiple()(または別のエンティティタイプを使用する場合は同等のもの)。

$nodes = node_load_multiple(array_keys($results['node']));

$conditionsパラメータnode_load_multiple()は廃止されていることを覚えておいてください。EntityFieldQuery私が理解していることを支持します。

理論的には、サブクラスEntityFieldQueryを作成してexecute()メソッドをオーバーライドし、完全に読み込まれたエンティティを返すことができます。ただし、クラスを拡張して、クエリ対象のエンティティの種類が常にわかるようにする必要もあります。そうしないと、で使用するキーがわかりません$results


ありがとうございました。ちょっとした疑いです。あなたが言うとき、私は取得できませんでした「サブクラスをEntityFieldQuery-しかし、あなたはよまた、クラスを拡張する必要があります」。サブクラスを作成することは、サブクラスを拡張することと同じではありませんか?それとも私が理解していない他のことを言っているのですか?
AjitS 2013

申し訳ありませんが、言葉の選択が不十分です。私はちょうどあなたがエンティティオブジェクトをロードするために必要なことだろうと無条件に、エンティティ型の引数を受け入れるには、あなたのサブクラスを装備する必要があります意味
クライヴ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.