我正在尝试使用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);
}
问题:参数'关键字'始终是$ keywordsarray的最后一个元素...
所以例如,当我在搜索字段中键入"约翰·史密斯"时,我有:
$ keywordsarray
array (size=2)
0 => string 'John' (length=4)
1 => string 'Smith' (length=5)
循环中的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%')
我期望的是:
SELECT [...]
FROM [...]
WHERE (l0_.name LIKE '%John%' OR a1_.surname LIKE '%John%')
AND (l0_.name LIKE '%Smith%' OR a1_.surname LIKE '%Smith%')
您有任何解释/解决方案吗?我应该修改如何解决问题?
您应该使用唯一的参数名称,例如:
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.'%');
}
因为您每次替换keyword
替换为新值