Symfony 3参数太多

时间:2017-06-06 14:11:59

标签: symfony parameters query-builder

我是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);
    }

如您所见,此查询具有条件参数,它返回表格所需的文章列表。但当我运行此查询来填充我的表时,我收到错误:

  

在渲染模板期间抛出了异常(" Too   许多参数:查询定义了0个参数,你绑定了1")。

我不知道他为什么期待0个参数。我尝试使用setParameters,但结果是一样的。

有没有人有想法?

2 个答案:

答案 0 :(得分:26)

您应该使用andWhere()方法而不是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 doc

  

指定查询结果的一个或多个限制     替换之前指定的任何限制(如果有)。

andWhere() php doc

  

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

答案 1 :(得分:2)

我在Symfony 4中使用Doctrine 2.6的错误是 Too many parameters: the query defines 0 parameters and you bound 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])

由于我找不到任何问题的答案,但与此类似,我想可能会帮助那些像我一样挣扎的人。