Итак, у меня есть 3 объекта внутри одной таблицы. Мне нужно иметь возможность искать 2 из 3 сущностей в одном выражении select, но я не уверен, как это сделать.
Как написать оператор выбора DQL для поиска некоторых, но не всех объектов в одной таблице наследования таблицы
Ответ 1
Используйте оператор INSTANCE OF
в вашем dql-запросе следующим образом (где User
- ваш базовый класс):
$em->createQuery('
SELECT u
FROM Entity\User u
WHERE (u INSTANCE OF Entity\Manager OR u INSTANCE OF Entity\Customer)
');
Doctrine переводит это в запросе sql в состоянии WHERE user.type = '...'
.
Смотрите здесь для более подробной информации о синтаксисе запроса dql.
Ответ 2
Ответ для нескольких экземпляров на самом деле не работает. Вам нужно будет сделать что-то подобное, чтобы проверить наличие нескольких экземпляров.
$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) . "')");
Ответ 3
Как прокомментировал flu, если вы хотите получить некоторые объекты из разных экземпляров с помощью QueryBuilder вместо DQL-запроса, вы можете использовать массив как параметр:
$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'])
;