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, но результат тот же.

У кого-нибудь есть идея?


person AKMMM    schedule 06.06.2017    source источник


Ответы (2)


Вы должны использовать методы 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-документ

Добавляет одно или несколько ограничений к результатам запроса, образуя логическую связку с любыми ранее указанными ограничениями.

person goto    schedule 06.06.2017
comment
Ты спас мой день ;) - person Slowwie; 11.05.2021

Моя ошибка в 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])

Поскольку я не мог найти ответа на свою проблему, но она была похожа на эту, я подумал, может быть, помочь кому-то, кто борется, как я.

person George Milojevic    schedule 17.05.2018