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 = ???
すばらしい質問です。
EntityFieldQuery
は本当に良いものですが、本当に真剣になりたい場合は、カスタムモジュールでクラスを作成し、そこで必要な動作を追加します。
正確な意図はわかりませんが、過去にこの件について この記事 を参照しました。このよく書かれた記事のニール・ヘイスティングスの功績。
オーバーライドのニースの例については、記事のコード例を少し見てください。
コーディングがお役に立てば幸いです。
私はこれに対する答えを見つけました! 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がインストールされていない場合は、そのクラスを拡張するためのコードをコピーするだけです。
何もオーバーライドしたり、クラスを拡張したりする必要はありません。 EntityFieldQuery
クラスの結果に必要なフィールドをアタッチするには、 field_attach_load()
を使用するだけです。
参照 エンティティから1つのフィールドのみを読み込む、またはNode in Drupal 7 )、これを行う方法の例を含む優れた記事。
それでも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 オプションで、ここにノードまたはユーザー(ベーステーブル)のようなものを追加します。