web-dev-qa-db-fra.com

EntityFieldQuery INNER JOIN

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

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.

30
Clive

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.

3
colan