Суб'єктна запит із кількома умовами на умовах таксономії не дає результатів


13

У моєму випадку використання є об'єкт, який має два поля, що посилаються на унікальні словники.

Новини: - тег (посилання на сутність) - категорія (посилання на суб’єкт)

Якщо я запитую по одній із цих посилань, я отримую результати, проте коли запитую обидва (фільтр І), я не отримую результатів. Я вже тричі перевірив це, і є об'єкти, які містять і тег, і категорію, яку я запитую.

Це помилка користувача чи помилка 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();

EDIT: Я знайшов обхід, запитуючи про вихідну вартість замість 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();

Сполученням EQ за замовчуванням є AND (який ви можете змінити), тому нічого групового для об'єднання умов разом немає, тому воно є там. Я не розумію, чого ти очікував?

Відповіді:


8

Причина того, що ви не можете зробити, полягає в тому, що обидва ці поля є посиланням на одну і ту ж сутність. Це означає, що базовий стіл - той самий базовий стіл.

Ви просите Drupal приєднати таблицю таксономії_даних до таблиці вузлів, а потім зробити неможливим І умову в ній.

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-допишіть наступного тижня, і ми дістанемося до кінця.


Це має бути зафіксовано в Drupal Core, але рішення вище працює.
Mr.B

1

Насправді я знайшов хак до цього. ось моє пояснення того, що я знайшов:

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

Я не пишаюся злом, але він працює, тому, якщо це допоможе комусь врятувати колись, продовжуйте це робити.

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