web-dev-qa-db-ja.com

symfony 3パラメータが多すぎます

私は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を使用してみましたが、結果は同じです。

誰かがアイデアを持っていますか?

9
AKMMM

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 doc

クエリ結果に対する1つ以上の制限を指定します。
以前に指定された制限があれば置き換えます。

andWhere() php doc

クエリ結果に1つ以上の制限を追加し、以前に指定された制限との論理結合を形成します。

35
goto

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])

私は自分の問題に対する答えを見つけることができませんでしたが、これに似ていたので、私がそうであるように苦労している誰かを助けるかもしれないと思いました。

3