在 Doctrine 2,Querybuilder 中添加嵌套 OR 语句
Adding nester OR statements in Doctrine 2, Querybuilder
我有一个一对多实体:
User -> OrderPerson
一个用户可以拥有多个orderPersons。
一个 orderPerson 链接到 Orders,可以有多个订单。
我想做的是构建一个动态查询来处理这个问题,这是我目前所做的:
public function getPaged($page, $count , $orderPersons = null)
{
$qb = $this->orderRepository->createQueryBuilder('c')
->orderBy('c.id', 'DESC');
if ($orderPersons != null )
{
foreach ($orderPersons AS $orderPerson)
{
$qb->where('c.orderPerson='.$orderPerson); ***
}
}
$query = $qb->getQuery();
}
我纠结的地方是如何写这行:
$qb->where('c.orderPerson='.$orderPerson);
我阅读了文档,我想我需要使用类似这样的东西但我不确定:
$qb->andWhere(
$qb->expr()->orX(
$qb->expr()->eq('c.orderPerson='.$orderPerson)
)
);
但是我不确定如何将其放入循环中。
我对 D2 文档的一大批评是他们在 exprs 上花费了大量时间,但大多数时候你真的不需要它们。只会让代码难以阅读。
话虽如此,您的查询不需要 OR 条件,只需一个 IN 子句。
// Join the order persons
$qb->leftJoin(c.orderPersons,'orderPerson');
// Need at least one
if (is_array($orderPersons) && count($orderPersons)) {
$qb->andWhere('orderPerson.id IN (:orderPersons));
$qb->setParameter('orderPersons',$orderPersons);
}
当然未经测试,因此可能存在语法错误,但您应该明白了。
我有一个一对多实体:
User -> OrderPerson
一个用户可以拥有多个orderPersons。
一个 orderPerson 链接到 Orders,可以有多个订单。
我想做的是构建一个动态查询来处理这个问题,这是我目前所做的:
public function getPaged($page, $count , $orderPersons = null)
{
$qb = $this->orderRepository->createQueryBuilder('c')
->orderBy('c.id', 'DESC');
if ($orderPersons != null )
{
foreach ($orderPersons AS $orderPerson)
{
$qb->where('c.orderPerson='.$orderPerson); ***
}
}
$query = $qb->getQuery();
}
我纠结的地方是如何写这行:
$qb->where('c.orderPerson='.$orderPerson);
我阅读了文档,我想我需要使用类似这样的东西但我不确定:
$qb->andWhere(
$qb->expr()->orX(
$qb->expr()->eq('c.orderPerson='.$orderPerson)
)
);
但是我不确定如何将其放入循环中。
我对 D2 文档的一大批评是他们在 exprs 上花费了大量时间,但大多数时候你真的不需要它们。只会让代码难以阅读。
话虽如此,您的查询不需要 OR 条件,只需一个 IN 子句。
// Join the order persons
$qb->leftJoin(c.orderPersons,'orderPerson');
// Need at least one
if (is_array($orderPersons) && count($orderPersons)) {
$qb->andWhere('orderPerson.id IN (:orderPersons));
$qb->setParameter('orderPersons',$orderPersons);
}
当然未经测试,因此可能存在语法错误,但您应该明白了。