EntityFieldQuery vs Db_select()


回答:


11

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

たとえば、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();

14

私はprefering主な理由だと思うEntityFieldQuery以上にdb_selectものがデータベースに格納されている方法:あなたが他の言葉で、下位レベルの構造について知る必要がないということです。これにより、疎結合が改善されます。


6
これは正しいですが、さらに先へ進みます。フィールドストレージはプラガブルです。デフォルトの実装では、データベースのフィールドごとに個別のテーブルにフィールドデータが格納されますが、置き換えることができます。たとえば、MongoDBにフィールドデータを格納できる実装があります。特定のサイト構成で動作するだけでなく、コードを移植可能にする場合は、EntityFieldQueryを使用する必要があります。
ベルディール

3

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を使用して、必要なものだけにアクセスできます。
ケビン

entity_metadata_wrapper()ここでどのように役立つかわかりません。まだエンティティをロードする必要があります。
フラビオフ

1

EntityFieldQueryはに比べてはるかに制限されているのでdb_select()、使用しないのに十分な理由があるはずですdb_select()(バートの回答を参照)。これは十分に読みやすく、はるかに柔軟です。

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


さて、なぜ私のanwserが「-1」だったのか知りたいです。ええ、entityFieldQueryはきれいですが、非常に素晴らしく、堅牢で完全なAPIであるdb_selectよりも効率的ではありません...特定のユースケースに対して制限が多すぎるため、コードから多くのentityFieldQueryを削除します。指摘した。とにかく。
yann_yinn

1
いくつかの回答は、entityFieldQueryがさまざまなストレージメソッドの上にある抽象化レイヤーであり、それがクールな機能である方法を認識できないため、あなたの答えを好まないと思います。たとえば、MySQLは常にx / y / zのデータベースであり、必要に応じてよりスリムなdbクエリを作成することをお勧めします。entityFieldQueryがdb_selectよりきれいだとは思いません。ページ上部の2つの比較は視覚的にほぼ同じです。
チャーリーシュリーサー

うん、だからこそ「バートの答えを見る」と書いた。この特別なユースケースを除いて、db_selectはより効率的で、はるかに柔軟です。
yann_yinn

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.