Db_select()で同じ作業を行って値をフェッチできるのに、なぜEntityFieldQueryを使用する必要があるのですか。
誰かがリンクだけでなく例を提供できるといいでしょう。
Db_select()で同じ作業を行って値をフェッチできるのに、なぜEntityFieldQueryを使用する必要があるのですか。
誰かがリンクだけでなく例を提供できるといいでしょう。
回答:
ポイントは、構文がはるかに単純であり、コードがより理解しやすいということだと思います。
たとえば、Db_Selectを使用してvalue my_type
という名前のフィールドを持つタイプのノードが必要な場合、yuollは次のようなことを行います。field_foo
$val
$nids = db_select('node', 'n')
->fields('n', array('nid'))
->join('field_data_field_foo', 'foo', 'foo.entity_id = n.nid')
->condition('n.type', 'my_type')
->condition('foo.field_foo_value', $val)
->execute()->fetchCol();
EntityFieldQueryの方がはるかに簡単です:
$query = new EntityFieldQuery;
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
私はprefering主な理由だと思うEntityFieldQuery
以上にdb_select
ものがデータベースに格納されている方法:あなたが他の言葉で、下位レベルの構造について知る必要がないということです。これにより、疎結合が改善されます。
EntityFieldQuery(EFQ)は、エンティティIDのみを返します。エンティティデータにアクセスする場合は、を呼び出す必要があります。entity_load()
これにより、データの読み込み中に、通常は気にしないすべての基礎となるもの(フィールドの読み込み、他のモジュールフックの呼び出しなど)が行われます。 。もちろん、これにより2つの SQLクエリと多くのオーバーヘッドが発生しますが、これは抽象化の代価です。
EFQ構文がより明確であることに関しては、個人的な好みの問題であると思います。たとえば、私はEFQがより明確だとは思わない。db_select()
EFQ を使用した実際の置き換えには、戻り値のテストと後続のentity_load()
呼び出しを含める必要があり、これによりコードIMHOに多くのノイズが追加されることに注意してください。
$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
if (!empty($entities['node'])) {
$nodes = entity_load('node', array_keys($entities['node']));
} else {
$nodes = array();
}
したがって、あなたの質問に答えてください:あなたのエンティティがフル機能を備えている場合(例えば、フィールド化可能、他のモジュールで使用可能など)、および/または構文がより明確だと思う場合はEFQを使用してください。それ以外の場合、使用する可能性がありますdb_select()
。
entity_metadata_wrapper()
ここでどのように役立つかわかりません。まだエンティティをロードする必要があります。
EntityFieldQueryはに比べてはるかに制限されているのでdb_select()
、使用しないのに十分な理由があるはずですdb_select()
(バートの回答を参照)。これは十分に読みやすく、はるかに柔軟です。
たとえば、innerJoinをentityFieldQuery
使用してフィールドを取得します。何らかの理由でleftJoinが必要な場合は、閉じ込められています...
http://drupal.org/node/1226622