我有一个项目,我处理客户订单.其中一些订单是通过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)
您只需将实体左侧加入其自身的特定子类.(您可以根据用例调整我的简单查询.)
我曾尝试过这一次,但似乎有效.
| 归档时间: |
|
| 查看次数: |
3876 次 |
| 最近记录: |