it-swarm-ja.com

EntityFieldQueryとDb_select()

値を取得するために Db_select() で同じ作業を実行できるのに、なぜ EntityFieldQuery を使用する必要があるのですか?.

リンクだけでなく、誰かが例を提供できれば、より良いでしょう。

18
j2r

ポイントは、構文がはるかに単純で、コードがより理解しやすいということです。

たとえば、my_typeという名前のフィールドに値field_fooがあり、Db_Selectがあるタイプ$valのノードが必要な場合、yuollは次のようにします。

$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();
11
IcanDivideBy0

EntityFieldQueryを優先する主な理由はdb_selectは、下位レベルの構造、つまり、データベースへの格納方法について知る必要がないことです。これは 疎結合 を改善します。

14
Bart

EntityFieldQuery(EFQ)はエンティティIDのみを返します。エンティティデータにアクセスする場合は、entity_load()を呼び出す必要があります。これにより、データの読み込みの中で、通常は気にしないすべての基本的なもの(フィールドの読み込み、その他の呼び出しなど)が確認されます。モジュールフックなど)を作ります。もちろん、これはtwo SQLクエリと多くのオーバーヘッドをもたらしますが、これは抽象化の代償です。

EFQ構文の明確化については、個人の好みの問題のほうがはるかに多いと思います。例えば、私はnotを行うと、EFQがより明確になると思います。 EFQで動作するdb_select()の置き換えには、戻り値のテストとそれに続く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()を使用できます。

3
flaviovs

EntityFieldQuerydb_select()よりもはるかに制限されています。したがって、db_select()(バートの回答を参照)を使用しないという十分な理由があるはずです。 。

たとえば、entityFieldQueryを使用してinnerJoinフィールドをフェッチします。何らかの理由でleftJoinが必要な場合、閉じ込められます... http://drupal.org/node/1226622

1
yann_yinn