entityQuery с несколькими условиями на условиях таксономии не возвращает результата

13

В моем случае использования у меня есть объект, который имеет два поля, которые ссылаются на уникальные словари.

Новости: - тег (ссылка на сущность) - категория (ссылка на сущность)

Если я запрашиваю одну из этих ссылок, я получаю результаты, однако, когда я запрашиваю оба (фильтр 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();
Sketchy Coder
источник
Соединением по умолчанию для EQ является AND (которое вы можете изменить), поэтому нет ничего плохого в объединении условий вместе ... вот почему оно там. Я не понимаю, что вы ожидали?

Ответы:

8

Причина, по которой вы не можете этого сделать, заключается в том, что оба эти поля являются ссылкой на один и тот же объект. Это означает, что базовая таблица - это та же базовая таблица.

Вы просите Drupal присоединить таблицу taxonomy_data к таблице узлов и затем выполнить невозможное условие AND.

PS

Вы можете использовать condition('field_tags', 1);вместоcondition('field_tags', [1], 'IN');

И, как упоминалось в комментариях, группа условий AND используется по умолчанию, поэтому вам не нужно ее указывать.

PPS

Вы должны использовать оба условия, чтобы ссылочный идентификатор был согласованным.

Эяль
источник
1
Этот ответ охватывает только наивное воображение того, как может работать запрос сущности. Это намного, намного более способно чем это, однако. Проверьте мой ответ.
3

Дикая, не проверенная догадка:

$query = \Drupal::entityQuery('node')
  ->condition('status', 1)
  ->condition('type', 'news');

$query = $query->condition($query->andConditionGroup()->condition('field_tag.entity.name', ['cars'], 'IN'))
  ->condition($query->andConditionGroup()->condition('field_category.entity.name', ['sport'], 'IN'));

Если это не сработает, найдите меня в IRC # drupal-contribus на следующей неделе, и мы дойдем до конца.

Тим Яо
источник
Это должно быть исправлено в Drupal Core, но решение выше работает.
Мистер Б.
1

На самом деле я нашел взломать это. вот мое объяснение того, что я нашел:

В моем типе контента было три поля, каждое из которых содержало ссылку на термин таксономии из разных словарей. И я хотел запросить сущности с теми, у которых есть определенный термин таксономии в каждом из этих 3 полей (а и условие).

проверяя внутренний запрос SQL, который создается после нескольких попыток с различными комбинациями условий, я обнаружил, что

[Previous conditions] AND (taxonomy_term__[taxonomy_term_field_name] IN  (:db_condition_placeholder_2)) AND (taxonomy_term__[taxonomy_term_field_name] IN  (:db_condition_placeholder_3)) AND (taxonomy_term__[taxonomy_term_field_name] IN  (:db_condition_placeholder_4))

в основном, как вы можете видеть, он не имеет ссылки на реальные отдельные поля, использующие этот конкретный словарь, поэтому мой хак должен сделать что-то вроде этого:

 $query = \Drupal::entityQuery('node')
            ->condition('status', '1')
            ->condition('type', $content_type_machine_name)
            ->condition('field_holding_term_ref.entity.name', array($label_of_term_in_field1, $label_of_term_in_field2, $label_of_term_in_field3), 'IN');

опять же, это работает, я проверил это и работает как условие AND, возвращающее только тип контента с этими 3 терминами таксономии, даже если ссылки на эти термины таксономии хранятся в разных полях в типе контента.

Я не горжусь взломом, но он работает, поэтому, если это поможет кому-то сэкономить, сделайте это.

Элиас
источник