Nigdy wcześniej nie musiałem tego robić, ale nie wydaje się, że możesz tworzyć zapytania OR EntityFieldQuery
, ponieważ db_or
jest ono używane do wybranych zapytań.
Przykładem może być wszystkie podmioty, które mają pole daty, w którym wartość jest zerowa lub po dniu dzisiejszym.
Czy brakuje mi czegoś lub jakiejś sztuczki, czy to po prostu nie jest obsługiwane?
Odpowiedzi:
Widziałem rozwiązanie tego problemu . Chodzi o to, aby użyć
addTag()
w zapytaniu i implementacjihook_query_TAG_alter()
, gdzie masz dobry starySelectQuery
obiekt.źródło
Możesz sublassować
EntityFieldQuery
i zastąpić niektóre metody.Warunki, które są dodawane do obiektu klasy
EntityFieldQuery
(np. Warunek właściwości) są dodawane do tablicy.Po zbudowaniu zapytania tablica ta jest następnie używana w pętli podobnej do poniższej (kod jest obecny w EntityFieldQuery :: propertyQuery () ):
$select_query
zawiera wartość zwróconą z wywołania dodb_select()
.źródło
Nie obawiam się, że OR nie są natywnie wspierane przez
EntityFieldQuery
klasę.Jednym sposobem może być dodanie znacznika do zapytania za pomocą przy pomocy
->addTag()
, a następnie zaimplementowaniehook_query_TAG_alter()
ręcznej zmiany wewnętrznej struktury zapytania dla zapytań zawierających ten znacznik.W ten sposób będziesz mógł przejrzeć istniejące warunki i dokonać niezbędnych zmian, aby dodać swoją
OR
logikę. Nie jest to jednak ładny sposób na zrobienie tego; możesz znaleźć przykład tutaj .źródło
Nie trzeba dzielić zapytań na 2 i łączyć ani nic w tym rodzaju. Wystarczy zmienić zapytanie
Rozważmy scenariusz: miałem 2 typy jednostek o nazwach komputerów: instrukcje tincan i tincan_agents
5 pól referencyjnych encji na encji
4 z nich to zwykłe pola referencyjne encji, a piąte (tincan_object) to pole referencyjne typu wiele encji, każde pole referencyjne odnosi się do encji typu „Agent”.
Pole referencyjne tincan_object może odwoływać się do Agentów i Działań (trzeci typ encji). Agent ma właściwość typ_obiektu, którą może być Agent lub Grupa.
Chcę znaleźć dowolną instrukcję, która odwołuje się do jednego z kilku możliwych agentów, w dowolnym polu referencyjnym. Potrzebujemy operatora OR między fieldConditions, ale musimy również sprawdzić typ_obiektu pola referencyjnego typu wielu encji i upewnić się, że jest to jedna z dwóch możliwości.
Poniższy kod reprezentuje najprostszy możliwy, w naszym rozwiązaniu zapytanie zawierało wiele innych warunków, pól itp., Więc kod nie musiał liczyć na kolejność warunków, a nawet jeśli wszystkie te pola były sprawdzane.
Rozwiązanie: Uwaga w powyższym EntityFieldQuery
To taguje zapytanie, umożliwiając implementację hook_query_TAG_alter ()
źródło
OP chce zapytać o jednostki o dacie zerowej LUB większej niż x, chciałem zapytać o węzły bez zdefiniowanego języka LUB języka użytkownika.
addTag()
jest najlepszym rozwiązaniem do dodania rzeczywistej instrukcji OR, ale w moim przypadku byłoby to przesadą. Moje bardzo proste OR można osiągnąć, wyszukując właściwość języka w tablicy za pomocą:źródło