$ query->和Where()内的Foreach语句

时间:2017-02-06 09:22:36

标签: php symfony foreach doctrine query-builder

我需要使用foreach语句使用Doctrine QueryBuilder创建一个查询,目前使用以下一个但不是最正确的:

// $query object
foreach ($searches as $value) {
                $query->andWhere($query->expr()->orX(
                    $query->expr()->eq('c.firstName', ':name'),
                    $query->expr()->eq('c.lastName', ':name')
                ))->setParameter('name', $value);
            }

这给了我:

  

.... WHERE .... AND(a0_.first_name =?OR a0_.last_name =?)AND   (a0_.first_name =?或a0_.last_name =?)ORDER BY a0_.first_name ASC

虽然我需要:

  

... WHERE ..... AND(a0_.first_name =?OR a0_.last_name =?OR   a0_.first_name =?或者a0_.last_name =?)ORDER BY a0_.first_name ASC

我需要这样的东西,但是PHP并没有这样做。允许它当然:

// $query object

                    $query->andWhere($query->expr()->orX(
                     foreach ($searches as $value) {
                        $query->expr()->eq('c.firstName', ':name'),
                        $query->expr()->eq('c.lastName', ':name')
                        }
                    )
                    )->setParameter('name', $value);

请你帮我用foreach声明达到我的目标。感谢您的平常帮助。

2 个答案:

答案 0 :(得分:1)

对于每个需要其中一种解决方案的人:

    if (!empty($search)) {
                       $orX = $query->expr()->orX();
                       $i=0;
                       foreach ($searches as $value) {
                           $orX->add($query->expr()->eq('c.firstName', ':name'.$i));
                           $orX->add($query->expr()->eq('c.lastName', ':name'.$i));
                           $query->setParameter('name'.$i, $value);
                $i++;
                }
                $query->andWhere($orX);
             }

答案 1 :(得分:0)

您好,您可以通过使用CONCAT和IN阵列

来使用此aproche
->where("CONCAT(CONCAT(c.firstName, '_'),c.lastName) IN (:names)")->setParameter('names', $names)

像这样的变量$ names

array(firstName_lastName,firstName1_lastName,firstName2_lastName2,...);