加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – QueryBuilder:循环中的参数

发布时间:2020-12-13 17:46:32 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试使用SF2 / Doctrine Querybuilder为搜索字段构建请求. 在我的搜索字段中,我希望能够键入多个关键字,并获得与所有关键字匹配的结果. 所以,这是我的代码(在存储库中): foreach ($keywordsArray as $keyword) { $qb-andWhere($qb-expr()-orX( $qb-ex
我正在尝试使用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);
    }

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

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

$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),":keyword_".$id)                    
    ));
    $qb->setParameter("keyword_".$id,'%'.$keyword.'%');
}

因为您每次都用新值替换关键字

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读