EntityFieldQuery INNER JOIN


21

EntityFieldQueryオブジェクトを使用してクエリを実行したいと思います。nodeテーブルとnode_accessテーブルの両方の値が必要なので、INNER JOINを使用する必要があります。doドキュメントから、これがどのように可能かを理解できません。

これが私が持っているものです-

$query = new EntityFieldQuery();
$result = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'node_access')
->propertyCondition('type', 'external_link')
->propertyCondition('status', 1)
->fieldCondition('gid', '3', '=')
->fieldCondition('realm', 'domain_id', '=')
->fieldCondition('grant_view', '1', '>=')
->range(0,1)
->execute();

1
Drupal 7でオンザフライで実行することはできませんが、Drupal 8で実行できます(この記事の執筆時点ではリリースされていません)。詳細については、エンティティフィールドクエリの結合サポートを参照してください(例を含む)。
コラン

Drupal 8では、すべての条件はそのようなものです(-> condition())。D8のEFQの例:$ result = \ Drupal :: entityQuery( 'node')-> condition( 'type'、array( 'entity_a'、 'entity_b')、 'IN')-> condition( 'status' 、NODE_PUBLISHED)-> condition( 'field_myfield.value'、 '5'、 '=')-> execute(); Drupal 8 EFQでは、列はfield_name.valueまたはdrupal 7のfield_name.target_idによって名前フィールドで直接定義されます->fieldCondition('field_name', 'target_id', $entities_a, 'IN');
woprrr

回答:


30

追加の結合をEntityFieldQuery直接追加することはできません(サポートされていません)が、クエリにタグを追加し、実装しhook_query_TAG_alter()、クエリが標準のdbクエリに変換されるときに手動で結合を追加できます。

これはテストされていませんが、ほとんどの場合、おそらくそこに到達します:

$query = new EntityFieldQuery;
$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'node_access')
  // etc
  ->addTag('MYTAG');

// get the query results as normal

そして、クエリのalter関数:

function MYDMOULE_query_MYTAG_alter(QueryAlterableInterface $query) {
  $query->join('node_access', 'node_access', 'node_access.nid = node.nid');
}

他の方法は、サブクラスEntityFieldQuery自体に結合を追加することですが、この場合は上記の方法の方が簡単だと思います。


単一の関数でそれを行うより良い方法はありますか?そうでなくてもEntityFieldQuery
アラントーマス

2
そうでもない、唯一の他の方法は、使用して手動でクエリを構築することであるdb_selectあなたがそれの上にしたいと、あなたは多くのコントロールとして持つことができます
クライヴ

それで行きます。THX
アラン・トーマス

@Clive ...ああ、この答えは本当に面白いです。いいね。:P-
テンケン

2
@Michiel No EntityFieldQueryはキャッシングを行わずSelectQuery、エンティティをラップしていくつかのメソッドを追加します。これらの追加メソッドを使用すると、通常のとは対照的に、それを使用して体験したいわずかな(ごくわずか)パフォーマンスの低下を占めるSelectQuery
クライヴ

3

独自のテーブルでカスタムプロパティを使用している場合、タグメソッドは機能しません。代わりにサブクエリを使用する必要があります。

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'user');

$roles_subquery = db_select('users_roles', 'ur');
$roles_subquery->fields('ur', array('uid'));
$roles_subquery->condition('rid', $my_role_id);

$query->propertyCondition('uid', $roles_subquery, 'IN');

EntityFieldQueryに結合が必要、サブクエリはどうですか?を参照してください詳細については。


カスタムテーブルを使用して、私のようなケースに最適なソリューション。お見事!
イグナシオセグラポスティゴ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.