Symfony 3参数太多

AKM*_*MMM 8 parameters query-builder symfony

我是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);
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

有没有人有想法?

got*_*oto 35

您应该使用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'] . '%');
    }
Run Code Online (Sandbox Code Playgroud)

where() php doc

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

andWhere() php doc

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