В моем случае использования у меня есть объект, который имеет два поля, которые ссылаются на уникальные словари.
Новости: - тег (ссылка на сущность) - категория (ссылка на сущность)
Если я запрашиваю одну из этих ссылок, я получаю результаты, однако, когда я запрашиваю оба (фильтр AND), я не получаю никаких результатов. Я уже проверил трижды, и есть объекты, которые содержат тег и категорию, которые я запрашиваю.
Это ошибка пользователя или ошибка Drupal?
$query = \Drupal::entityQuery('node')
->condition('status', 1)
->condition('type', 'news')
;
$group = $query->andConditionGroup()
->condition('field_tag.entity.name', ['cars'], 'IN')
->condition('field_category.entity.name', ['sport'], 'IN')
;
$query->condition($group);
$nids = $query->execute();
РЕДАКТИРОВАТЬ: я нашел обходной путь, запросив необработанное значение вместо entity.value. Это нежелательная ситуация, хотя
$query = \Drupal::entityQuery('node')
->condition('status', 1)
->condition('type', 'news')
;
$group = $query->andConditionGroup()
->condition('field_tag.entity.name', ['cars'], 'IN')
->condition('field_category', [1], 'IN')
;
$query->condition($group);
$nids = $query->execute();
Ответы:
Причина, по которой вы не можете этого сделать, заключается в том, что оба эти поля являются ссылкой на один и тот же объект. Это означает, что базовая таблица - это та же базовая таблица.
Вы просите Drupal присоединить таблицу taxonomy_data к таблице узлов и затем выполнить невозможное условие AND.
PS
Вы можете использовать
condition('field_tags', 1);
вместоcondition('field_tags', [1], 'IN');
И, как упоминалось в комментариях, группа условий AND используется по умолчанию, поэтому вам не нужно ее указывать.
PPS
Вы должны использовать оба условия, чтобы ссылочный идентификатор был согласованным.
источник
Дикая, не проверенная догадка:
Если это не сработает, найдите меня в IRC # drupal-contribus на следующей неделе, и мы дойдем до конца.
источник
На самом деле я нашел взломать это. вот мое объяснение того, что я нашел:
В моем типе контента было три поля, каждое из которых содержало ссылку на термин таксономии из разных словарей. И я хотел запросить сущности с теми, у которых есть определенный термин таксономии в каждом из этих 3 полей (а и условие).
проверяя внутренний запрос SQL, который создается после нескольких попыток с различными комбинациями условий, я обнаружил, что
в основном, как вы можете видеть, он не имеет ссылки на реальные отдельные поля, использующие этот конкретный словарь, поэтому мой хак должен сделать что-то вроде этого:
опять же, это работает, я проверил это и работает как условие AND, возвращающее только тип контента с этими 3 терминами таксономии, даже если ссылки на эти термины таксономии хранятся в разных полях в типе контента.
Я не горжусь взломом, но он работает, поэтому, если это поможет кому-то сэкономить, сделайте это.
источник