Как написать оператор выбора DQL для поиска некоторых, но не всех объектов в одной таблице наследования таблицы

Итак, у меня есть 3 объекта внутри одной таблицы. Мне нужно иметь возможность искать 2 из 3 сущностей в одном выражении select, но я не уверен, как это сделать.

Ответ 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'])
;