EntityFieldQuery ВНУТРІШНЯ ПРИЄДНАЙТЕСЬ


21

Я хотів би запустити запит за допомогою об’єкта EntityFieldQuery. Мені потрібне значення і з таблиці node, і з node_access, тому мені потрібно використовувати INNER JOIN. З документації do я не можу зрозуміти, як це можливо.

Ось що я маю -

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

1
Хоча це неможливо зробити під час роботи в Drupal 7, це можна зробити в Drupal 8 (не опублікований на момент написання цього повідомлення). Детальні відомості (зокрема про приклад) див. У запиті Entity Field .
колан

У Drupal 8 всі умови такі: (-> умова ()). Приклад EFQ у D8: $ result = \ Drupal :: entitQuery ('вузол') -> умова ('type', масив ('entit_a', 'entit_b'), 'IN') -> умова ('статус') , NODE_PUBLISHED) -> умова ('field_myfield.value', '5', '=') -> Execute (); У Drupal 8 EFQ стовпчик визначається безпосередньо в полі імені field_name.value або field_name.target_id в drupal 7->fieldCondition('field_name', 'target_id', $entities_a, 'IN');
woprrr

Відповіді:


30

Не можна додавати додаткові приєднання 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себе і додати приєднання, але я думаю, що вищевказаний метод у цьому випадку простіший.


Чи є кращий спосіб зробити це в одній функції? Навіть якщо це не такEntityFieldQuery
Аллан Томас

2
Насправді, єдиний інший спосіб - створити запит вручну, використовуючи db_select, тоді ви можете мати стільки контролю, скільки вам захочеться
Clive

Я піду з цим. Thx
Аллан Томас

@Clive ... о, ця відповідь справді цікава. Люблю це. : P
tenken

2
@Michiel Ні EntityFieldQueryне робить кешування, він просто обертається навколо SelectQueryта додає деякі методи для сутностей. Ці додаткові методи пояснюють незначне (дуже незначне) зниження продуктивності, яке ви відчуєте, використовуючи його, на відміну від звичайногоSelectQuery
Clive

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, а як щодо підзапросу? для деталей.


Відмінне рішення для таких випадків, як моя, із спеціальними таблицями. Дивовижна робота!
Ігнасіо Сегура Постіго
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.