在 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);
}

当然未经测试,因此可能存在语法错误,但您应该明白了。