entityQuery z wieloma warunkami na warunkach taksonomicznych nie zwraca żadnego wyniku


13

W moim przypadku użycia mam encję, która ma dwa pola, które odnoszą się do unikalnych słowników.

Wiadomości: - tag (odniesienie do podmiotu) - kategoria (odniesienie do podmiotu)

Jeśli zapytam o jedno z tych odniesień, otrzymam wyniki, ale kiedy zapytam o oba (filtr ORAZ), nie otrzymam żadnych wyników. Do tej pory sprawdziłem go trzykrotnie i istnieją podmioty, które zawierają zarówno znacznik, jak i kategorię, o którą pytam.

Czy to błąd użytkownika czy błąd Drupala?

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

EDYCJA: Znalazłem obejście, sprawdzając surową wartość zamiast encji.value. Jest to jednak sytuacja niepożądana

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

Domyślna koniunkcja dla EQ to AND (którą możesz zmienić), więc nie ma nic złego w grupowaniu warunków razem ... dlatego tam jest. Nie rozumiem, czego się spodziewałeś?

Odpowiedzi:


8

Powodem, dla którego nie możesz tego zrobić, jest to, że oba te pola odnoszą się do encji do tej samej encji. Oznacza to, że stół podstawowy jest tym samym stołem podstawowym.

Pytasz Drupala, aby przyłączył tabelę taksonomii do tabeli węzłów, a następnie uczynił na niej niemożliwy warunek ORAZ.

PS

Możesz użyć condition('field_tags', 1);zamiastcondition('field_tags', [1], 'IN');

Jak wspomniano w komentarzach, grupa warunków AND jest domyślna, więc nie trzeba jej określać.

PPS

Aby oba warunki były spójne, należy użyć identyfikatora, do którego się odwołuje.


1
Ta odpowiedź obejmuje tylko naiwną wyobraźnię, w jaki sposób mogłoby działać zapytanie encji. Jest jednak o wiele bardziej zdolny niż to. Sprawdź moją odpowiedź

3

Dzikie, niesprawdzone przypuszczenie:

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

Jeśli to nie zadziała, znajdź mnie w IRC # drupal-przyczynić się w przyszłym tygodniu, a my dotrzemy do końca.


Powinno to zostać naprawione w Drupal Core, ale powyższe rozwiązanie działa.
Mr.B

1

Właściwie znalazłem hack do tego. oto moje wyjaśnienie tego, co znalazłem:

Miałem 3 pola w moim typie treści, z których każdy zawierał odniesienie do terminu taksonomii z różnych słowników. Chciałem zapytać podmioty o te, które mają określony termin taksonomiczny w każdym z tych 3 pól (i warunek).

sprawdzanie wewnętrznego zapytania SQL, które jest generowane po kilku próbach z różnymi kombinacjami warunków, znalazłem to

[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))

w zasadzie, jak widać, nie ma odniesienia do rzeczywistych poszczególnych pól przy użyciu tego konkretnego słownictwa, więc mój hack polega na zrobieniu czegoś takiego:

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

znowu to działa, przetestowałem to i działa jako warunek AND, zwracając tylko typ zawartości z tymi 3 warunkami taksonomii, nawet jeśli odniesienia do tych warunków taksonomii są przechowywane w różnych polach w typie treści.

Nie jestem dumny z hacka, ale działa, więc jeśli to może pomóc komuś zaoszczędzić, skorzystaj z niego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.