在Doctrine,Docbuilder中添加nester OR语句

时间:2016-02-25 17:29:19

标签: doctrine-orm query-builder

我有一对多的实体:

User -> OrderPerson

用户可以拥有多个orderPersons。

orderPerson链接到订单,可以有多个订单。

我想要做的是构建一个动态查询来处理这个问题,这是我到目前为止所做的:

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

但我不确定如何将其置于循环中。

1 个答案:

答案 0 :(得分:1)

我对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);
}

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