Doctrine2:Polymorphic Queries:搜索子类的属性

tim*_*dev 14 php doctrine-orm

我有一个项目,我处理客户订单.其中一些订单是通过Amazon.com进行的.所以我有一个Order实体,以及一个扩展它的AmazonOrder实体.AmazonOrder添加的一件事是AmazonOrderId.

我需要实现广泛的搜索功能.用户可以在文本框中输入一些内容,并在一个大的where子句中用于一堆表达式.因此,例如,如果用户搜索"111",则结果包括ID为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();
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何添加一个条件,大致上说,"OR(订单是AmazonOrder和AmazonOrderId LIKE'$ userQuery%')"

有人有任何见解吗?要么是处理这个问题的方法,要么是至少确认这样做不可行?

Ian*_*ips 24

这是另一个适用于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);
Run Code Online (Sandbox Code Playgroud)

您只需将实体左侧加入其自身的特定子类.(您可以根据用例调整我的简单查询.)

我曾尝试过这一次,但似乎有效.