QueryBuilder:循环中的参数

Bla*_*sad 4 php sql symfony doctrine-orm

我正在尝试使用SF2/Doctrine Querybuilder为搜索字段构建请求.

在我的搜索字段中,我希望能够键入多个关键字,并获得与所有关键字匹配的结果.

所以,这是我的代码(在存储库中):

foreach ($keywordsArray as $keyword)
    {
        $qb->andWhere($qb->expr()->orX(
            $qb->expr()->like('p.name', ':keyword'),
            $qb->expr()->like('p.surname', ':keyword')                    
        ));
        $qb->setParameter('keyword', '%'.$keyword.'%');
        var_dump($keyword);
    }
Run Code Online (Sandbox Code Playgroud)

问题:参数'keyword'始终是$ keywordsArray的最后一个元素...

例如,当我在搜索字段中输入"John Smith"时,我有:

$ keywordsArray

array (size=2)
    0 => string 'John' (length=4)
    1 => string 'Smith' (length=5)
Run Code Online (Sandbox Code Playgroud)

循环中的var_dump($ keyword)告诉我$ keyword = John然后$ keyword = Smith.

但是,Symfony profiler告诉我执行的查询是:

 SELECT [...]
 FROM [...]
 WHERE (l0_.name LIKE '%Smith%' OR a1_.surname LIKE '%Smith%') 
 AND (l0_.name LIKE '%Smith%' OR a1_.surname LIKE '%Smith%')
Run Code Online (Sandbox Code Playgroud)

我期待的是:

 SELECT [...]
 FROM [...]
 WHERE (l0_.name LIKE '%John%' OR a1_.surname LIKE '%John%') 
 AND (l0_.name LIKE '%Smith%' OR a1_.surname LIKE '%Smith%')
Run Code Online (Sandbox Code Playgroud)

你有任何解释/解决方案吗?我应该修改什么才能解决问题?

Vic*_*sky 7

您应该使用唯一的参数名称,例如:

foreach ($keywordsArray as $id => $keyword)
{
    $qb->andWhere($qb->expr()->orX(
        $qb->expr()->like('p.name', ":keyword_".$id),
        $qb->expr()->like('p.surname', ":keyword_".$id)                    
    ));
    $qb->setParameter("keyword_".$id, '%'.$keyword.'%');
}
Run Code Online (Sandbox Code Playgroud)

因为你每次都换成keyword新的价值