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();
19 голосов | спросил atb 5 +04002012-10-05T20:54:46+04:00312012bEurope/MoscowFri, 05 Oct 2012 20:54:46 +0400 2012, 20:54:46

2 ответа


27

Вы не можете напрямую добавлять дополнительные соединения к 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');
}

Другим способом сделать это будет сам подкласс EntityFieldQuery и добавить соединение, но я думаю, что вышеописанный метод в этом случае проще.

ответил Clive 5 +04002012-10-05T21:04:36+04:00312012bEurope/MoscowFri, 05 Oct 2012 21:04:36 +0400 2012, 21:04:36
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, как насчет подзапроса? для деталей.

ответил colan 25 52016vEurope/Moscow11bEurope/MoscowFri, 25 Nov 2016 21:55:07 +0300 2016, 21:55:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132