Je voudrais exécuter une requête à l'aide de l'objet EntityFieldQuery. J'ai besoin de valeur à la fois du nœud et de la table node_access, donc j'aurais besoin d'utiliser INNER JOIN. De la documentation de d.o, je ne peux pas comprendre comment cela est possible.
Voici ce que j'ai -
$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();
Vous ne pouvez pas ajouter de jointures supplémentaires à un EntityFieldQuery
directement (ce n'est pas pris en charge), mais vous pouvez ajouter une balise à la requête, implémenter hook_query_TAG_alter()
, et ajouter la jointure manuellement lorsque la requête est convertie en une requête db standard.
Ce n'est pas testé, mais vous obtiendrez probablement la plupart du chemin:
$query = new EntityFieldQuery;
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'node_access')
// etc
->addTag('MYTAG');
// get the query results as normal
Et puis la fonction alter alter:
function MYDMOULE_query_MYTAG_alter(QueryAlterableInterface $query) {
$query->join('node_access', 'node_access', 'node_access.nid = node.nid');
}
L'autre façon de le faire serait de sous-classer EntityFieldQuery
lui-même et d'ajouter la jointure, mais je pense que la méthode ci-dessus est plus simple dans ce cas.
Si vous utilisez des propriétés personnalisées avec vos propres tables, la méthode des balises ne fonctionnera pas. Vous devez utiliser des sous-requêtes à la place:
$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');
Voir Besoin d'une jointure dans une EntityFieldQuery, que diriez-vous d'une sous-requête? pour plus de détails.