Tak więc mam 3 elementy w ramach jednej tabeli. Muszę mieć możliwość wyszukiwania 2 z 3 elementów w jednym oświadczeniu select, ale nie jestem pewien, jak to zrobić.Jak napisać instrukcję select DQL, aby wyszukać niektóre, ale nie wszystkie elementy w tabeli pojedynczej tabeli dziedziczenia
11
A
Odpowiedz
17
Użyj operatora INSTANCE OF
w zapytaniu DQL następująco (gdzie User
to klasa bazowa):
$em->createQuery('
SELECT u
FROM Entity\User u
WHERE (u INSTANCE OF Entity\Manager OR u INSTANCE OF Entity\Customer)
');
Doktryna przekłada się to w zapytaniu SQL w stanie WHERE user.type = '...'
.
Więcej informacji na temat składni zapytania dql można znaleźć pod numerem here.
1
Jak commented przez flu, jeśli chcesz odzyskać niektóre podmioty z różnych przypadkach z QueryBuilder zamiast zapytania DQL, można użyć tablicę jako parametr:
$qb = $this->createQueryBuilder('u');
->where('u.id > 10') //an arbitrary condition, to show it can be combined with multiple instances tests
->andWhere('u INSTANCE OF :classes')
->setParameter('classes', ['Entity\Manager', 'Entity\Customer'])
;
4
odpowiedź dla wielu przypadkach faktycznie robi nie działa. Trzeba by zrobić coś takiego, aby sprawdzić wiele instancji.
$classes = ['Entity\Manager', 'Entity\Customer'];
$qb = $this->createQueryBuilder('u');
->where('u.id > 10') //an arbitrary condition, to show it can be combined with multiple instances tests
->andWhere("u INSTANCE OF ('" . implode("','", $classes) . "')");
Można sprawdzić wiele wystąpień za pomocą polecenia '' WHERE (u INSTANCE OF (Entity \ Manager, Entity \ Customer)) ''. Jeśli masz '' QueryBuilder'' możesz użyć '' $ qb-> andWhere ('u INSTANCE OF: classes') -> setParameter ('classes', array ('Entity \ Manager', 'Entity \ Customer')); ''. – flu
Pamiętaj, że podczas pracy z mapą dyskryminatora możesz potrzebować użyć wartości dyskryminatora, możesz to zrobić w swoim repozytorium w ten sposób: '$ this-> getClassMetadata() -> discriminatorValue' –