Doctrine2: Полиморфные Запросы: Поиск по свойствам подклассов - PullRequest
14 голосов
/ 11 октября 2011

У меня есть проект, в котором я занимаюсь заказами клиентов.Некоторые из этих заказов осуществляются через Amazon.com.Итак, у меня есть сущность Order и сущность AmazonOrder, которая ее расширяет.AmazonOrder добавил еще одну вещь - AmazonOrderId.

У меня есть требование для реализации функции широкого поиска.Пользователь может ввести некоторые вещи в текстовое поле и использовать их в виде множества выражений в одном большом предложении where.Так, например, если пользователь выполнил поиск «111», результаты включают любые заказы с идентификатором, начинающимся с 111, любой заказ, отправленный в почтовые индексы, начинающиеся с 111, любой заказ, отправленный в «111 Main St», и т. Д..

Этот материал реализован с помощью созданного запросом строителя запроса, который имеет большое orX() выражение.

Теперь я хотел бы сопоставить все заказы, но если они 'AmazonOrder, также совпадает с AmazonOrderId.

И я застрял - я подозреваю, что это может быть невозможно

Вот как я строю запрос:

$qb->select('o,s')->from('PMS\Entity\Order', 'o');    
$qb->leftJoin('o.shippingInfo','s');
$qb->andWhere('o.status = :status');
$qb->setParameter('status',$status);
$qb->andWhere(
    $qb->expr()->orX(
        $qb->expr()->like('o.id',':query')
        $qb->expr()->like('s.address',':query')
        $qb->expr()->like('s.city',':query')
    )
);
$qb->setParameter('query',$userQuery .'%');

$orders = $qb->getQuery()->getResult();

И я не могу понять, как добавить условие, которое примерно говорит: «ИЛИ (Заказ - это AmazonOrder, А AmazonOrderId НРАВИТСЯ '$ userQuery%')"

У кого-нибудь есть понимание?Или способ справиться с этим, или хотя бы подтверждение того, что это невозможно сделать таким образом?

Ответы [ 2 ]

23 голосов
/ 04 декабря 2014

Вот еще одно решение, которое работает для меня с Doctrine 2.4:

$qb->select('o')
   ->from('Order', 'o')
   ->leftJoin('AmazonOrder', 'ao', 'WITH', 'o.id = ao.id')
   ->andWhere('o.id like :query or ao.amazonOrderId like :query')
   ->setParameter('query', $someQuery);

Вы только что присоединились к сущности на конкретном подклассе.(Вы можете адаптировать мой простой запрос к вашему варианту использования.)

Я пробовал это ровно один раз, но, похоже, он работает.

2 голосов
/ 11 октября 2011

Хм, у меня были похожие проблемы в моем последнем проекте доктрины.

Одно время это было только одно поле, поэтому я переместил его в родительский класс - не самое лучшее решение, но сработало.В каком-то другом случае там, где слишком много свойств, чтобы они загромождали родительский класс.Я сделал собственный SQL-запрос для поиска и получения идентификаторов записей, а затем использовал WHERE IN (...) dql для извлечения сущностей.

Компромиссом может быть доктрина ResultSetMappingкоторый может сопоставить собственный SQL-запрос напрямую с сущностями, хотя каждый раз, когда я работал с ним, я находил его довольно неуклюжим для использования, а накладные расходы для двух запросов (fetch ids & fetch entites), как указано выше, были пренебрежимо малы.* Может быть, вы могли бы что-то сделать с помощью оператора INSTANCEOF в вашем предложении WHERE, хотя я не думаю, что доктрина была бы достаточно умна, чтобы распознавать ее так, как вы хотите.

...