EntityFieldQueryでいくつかのフィールドのみを取得しますか?


19

Drupal 7には、EntityFieldQueryを使用した非常に有望なORMのようなクエリシステムがあります。

現在、ノードの選択方法を理解していますが、結果には、探しているフィールドなどの特定の情報は含まれていません。

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
                        ->entityCondition('bundle', 'event')
                        ->propertyCondition('status', 1)
                        ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
                        ->fieldOrderBy('field_date', 'value', 'ASC')
                        ->execute();

したがって、現在の例の「field_date」など、1つのフィールドの値のみを取得する場合は、ノードのデータ全体をロードする必要があります。

$nodes = entity_load('node', array_keys($entities['node']));

フィールドの値を取得する方法があり、代わりにすべてのノードの完全なデータをロードする方法がある場合、メモリのオーバーロードが発生します。

$nodesFieldDates = ???

回答:


10

いい質問です!

EntityFieldQuery 本当に良いものですが、あなたがあれば、本当に深刻な取得したい、カスタムモジュールでクラスをオーバーライドして、あなたがそこに行って必要なものは何でも行動追加する必要があります。

あなたの正確な意図はわかりませんが、過去にこのテーマに関するこの記事を参照しました。このよく書かれた記事に対するNeil Hastingsの功績。

オーバーライドの良い例については、記事のコード例を少し探してください。

それがお役に立てば幸いです!


なるほど、分かりました !したがって、おそらく、「EntityFieldQuery」「buildQuery」メソッドを再定義して、結果のフィールドを変更することが可能です。おそらく、これは動作する可能性があります。
フェディルRYKHTIK

11

これに対する答えを見つけました!Apache Solrモジュールは、それを実現するためにEntityFieldQueryクラス拡張します。addExtraFieldと呼ばれる新しいメソッドを追加します。

<?php
$query = new ApachesolrAttachmentsEntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'event')
  ->propertyCondition('status', 1)
  ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
  ->fieldOrderBy('field_date', 'value', 'ASC')
  ->addExtraField('field_date', 'value', 'value')
  ->execute();
?>

Apache Solrがインストールされていない場合は、単にそのクラスを拡張するためのコードをコピーしてください。


Apache Solrモジュールにはいくつかの欠点があるため、このためのサンドボックスを作成しましたdrupal.org/sandbox/mikeytown2/2209909
mikeytown2

2
mikeytown2によって作成された(現在はサンドボックス)モジュールに対してのみこの回答を支持しました(ありがとう!)
オリバーコールマン

答えのリンクが機能していないようです。「続行する前にサインインまたはサインアップする必要があります」と表示されます。
mbomb007



0

EFQからフィールドを取得したい場合は、EFQ Extra Fieldsモジュールをご覧ください

警告:このモジュールは、EntityFieldQueryを悪用してデータベースからデータを返します。エンティティまたはそれらに基づいて構築されるモジュールでは機能しません。

EntityFieldQueryExtraFieldsオブジェクト内でaddFieldを使用できます(EntityFieldQueryオブジェクトを拡張します)。最初に、EntityFieldQueryは、エンティティID、バンドル、およびエンティティタイプのみを返します。このモジュールは、追加のentity_loadsを実行せずに、その上に追加のレイヤーを追加します!大量のデータを処理する必要があり、SQLクエリを削減する場合に重要です。EFQはすでにこの情報をデータベースにクエリしているので、そのクエリを変更して、いくつかの追加フィールドも提供してください。これは、そのデータを取得するために追加のクエリが1つも実行されないことを意味します。

entity_loadまたは同様の関数で発生するポストフォーマット/ポストロードに依存している場合、このモジュールはそれを処理しません。取得したデータの有効性を自分で確認する必要があります。

例

ノードのタイトルを取得する

$ query = new EntityFieldQueryExtraFields();
  $ result = $ query-> entityCondition( 'entity_type'、 'node')
  -> propertyCondition( 'type'、 'my_bundle_type')
  -> propertyCondition( 'status'、1)
  -> addExtraField( 'field_myfield'、value '、value')
  -> addExtraField( 'field_mynodereffield'、nid '、nid')
  -> addExtraField( ''、 'title'、 'title'、 'node')
  -> fieldCondition( 'field_myfield'、 'value'、 'some_value_to_filter_on'、 '=')
  -> execute();
可能な組み合わせ:
addExtraField($ field_name、$ column、$ column_alias = NULL、$ table = NULL)

フィールド名
どのフィールドから追加フィールドを取得するかを指定します。ベーステーブルからのものである場合は、空のままにしてテーブル引数を入力します。

カラム
列の名前を指定し、

column_alias
列のエイリアスを指定し、

表
必要に応じて、ここにノードまたはユーザーのようなもの(ベーステーブル)を追加します。

私はこのモジュール(EFQ Extra Fields)とmikeytown2の(現在サンドボックス)モジュールの両方を試しましたが、後者ははるかに優れているようで(使いやすく、賢明な出力)、前者よりもずっとよく維持されているようです。mikeytown2サンドボックスモジュールはdrupal.org/sandbox/mikeytown2/2209909にあります。
オリバーコールマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.