我是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,但结果是一样的。
有没有人有想法?
答案 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])
由于我找不到任何问题的答案,但与此类似,我想可能会帮助那些像我一样挣扎的人。