web-dev-qa-db-ja.com

EntityFieldQueryで一部のフィールドのみを取得しますか?

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 = ???
18
Fedir RYKHTIK

すばらしい質問です。

EntityFieldQuery は本当に良いものですが、本当に真剣になりたい場合は、カスタムモジュールでクラスを作成し、そこで必要な動作を追加します。

正確な意図はわかりませんが、過去にこの件について この記事 を参照しました。このよく書かれた記事のニール・ヘイスティングスの功績。

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

コーディングがお役に立てば幸いです。

10
stefgosselin

私はこれに対する答えを見つけました! 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がインストールされていない場合は、そのクラスを拡張するためのコードをコピーするだけです。

11
mikeytown2

何もオーバーライドしたり、クラスを拡張したりする必要はありません。 EntityFieldQuery クラスの結果に必要なフィールドをアタッチするには、 field_attach_load() を使用するだけです。

参照 エンティティから1つのフィールドのみを読み込む、またはNode in Drupal 7 )、これを行う方法の例を含む優れた記事。

8
jyee

それでも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)
 
 field_name 
どのフィールドから追加フィールドを取得するかを指定します。ベーステーブルからのものである場合は、空のままにして、テーブル引数を入力します
 
 column 
列の名前を指定します
 
 column_alias 
列のエイリアスを指定します。
 
 table 
オプションで、ここにノードまたはユーザー(ベーステーブル)のようなものを追加します。
0
tenken