Symfony 3 参数过多

16

我是Symfony的新手,在运行查询时遇到了错误:

public function getFilteredArticles($page, $nbPerPage, $data) {
        $query = $this->createQueryBuilder('a')
                ->leftJoin('a.images', 'i')
                ->addSelect('i')
                ->leftJoin('a.type_stockage', 't')
                ->addSelect('t')
                ->leftJoin('a.famille', 'f')
                ->addSelect('f');
        if ($data['famille'] != '') {
            $query->where('f.id = :famille')
                    ->setParameter('famille', $data['famille']);
        }
        if ($data['rds'] == false) {
            $query->where('a.stock_actuel > 0');
        }
        if ($data['recherche'] != '' && $data['recherche'] != null) {
            $query->where('a.ref_article LIKE :recherche')
                    ->setParameter('recherche', '%' . $data['recherche'] . '%');
        }
        $query->leftJoin('a.sousfamille', 's')
                ->orderBy('a.ref_article', 'ASC')
                ->getQuery();

        $query->setFirstResult(($page - 1) * $nbPerPage)
                ->setMaxResults($nbPerPage);

        return new Paginator($query, true);
    }

这个查询有条件参数,可以看到它返回了我需要的文章列表。但是当我运行这个查询来填充我的表格时,我得到了一个错误信息:
“在模板渲染期间引发了异常(“参数过多:查询定义了0个参数,而您绑定了1个”)”。
我不知道为什么他期望0个参数。我尝试使用setParameters,但结果仍然相同。
有人有想法吗?
3个回答

73

您应该使用andWhere()方法而不是where()方法。
where()方法会删除之前的所有where,但setParameter()不会。这就是为什么他发现了比where子句更多的参数。

如果条件没有成为第一个条件的意义,我个人从不使用where,以避免这种错误。

    if ($data['famille'] != '') {
        $query->andWhere('f.id = :famille')
                ->setParameter('famille', $data['famille']);
    }
    if ($data['rds'] == false) {
        $query->andWhere('a.stock_actuel > 0');
    }
    if ($data['recherche'] != '' && $data['recherche'] != null) {
        $query->andWhere('a.ref_article LIKE :recherche')
                ->setParameter('recherche', '%' . $data['recherche'] . '%');
    }

where() php文档

指定一个或多个限制来查询结果。
如果已经指定了任何限制,则替换它们。

andWhere() php文档

添加一个或多个限制来查询结果,与任何之前指定的限制形成逻辑连接。


4

在Symfony 4中,使用Doctrine 2.6时,我的错误信息是:

参数过多:查询定义了0个参数,但您绑定了2个

问题在于我没有在andWhere方法中定义参数。

$this->createQueryBuilder('q')
...
->andWhere('q.propertyDate IS NOT NULL') //this also couldn't find anywhere
->andWhere('q.parameterName = :parameterName')
->setParameters(['q.parameterName' => $parameterName, ...2nd parameter])

由于我找不到与我的问题类似的答案,但是发现这个问题与我的问题相似,所以我想帮助一些像我一样苦苦挣扎的人。


-1
在Symfony 5和6中,你应该使用andWhere()方法而不是where()方法。 where()方法会移除之前的所有where子句,但setParameter()方法不会。这就是为什么他会发现比where子句更多的参数。

请勿重复现有答案,除非您想添加一些新见解。 - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接