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();
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
自体をサブクラス化して結合を追加することですが、この場合は上記の方法の方が簡単だと思います。
独自のテーブルでカスタムプロパティを使用している場合、タグメソッドは機能しません。代わりにサブクエリを使用する必要があります:
$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で結合が必要です。サブクエリはどうですか? を参照してください。