web-dev-qa-db-ja.com

EntityFieldQuery INNER JOIN

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

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

$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();
20
Allan Thomas

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

そしてクエリ変更機能:

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

もう1つの方法は、EntityFieldQuery自体をサブクラス化して結合を追加することですが、この場合は上記の方法の方が簡単だと思います。

30
Clive

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

$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で結合が必要です。サブクエリはどうですか? を参照してください。

3
colan