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();
Odpowiedzi:
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.
źródło
Dzikie, niesprawdzone przypuszczenie:
Jeśli to nie zadziała, znajdź mnie w IRC # drupal-przyczynić się w przyszłym tygodniu, a my dotrzemy do końca.
źródło
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
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:
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.
źródło