以下例外......
当我过滤两个属性两个不同实体的一部分并且每个属性需要一个doctrine_orm_callback时,参数号无效:绑定变量数不匹配 令牌数量
...出现在Sonata Admin中。
具体来说,在下面显示的代码中,当我填写与" consultant_id"相对应的搜索字段时,会出现异常。和" institute_name"属性。 (即填写浏览器中的两个搜索字段)。
注意:此异常实际上仅在使用来自不同实体的属性进行过滤时才会发生。另一方面:当使用同一实体的两个属性时,过滤效果很好。
更多信息:
可在此处找到完整的堆栈跟踪: http://www.php-schulung.de/sonata-admin-filter-invalid-parameter-number-stacktrace/
我通过在抛出异常的文件中插入var_dump来进一步检查:
vendor/doctrine/orm/lib/Doctrine/ORM/Query.php
// Prepare parameters
$paramMappings = $this->_parserResult->getParameterMappings();
var_dump($paramMappings);
echo '--------------------------';
var_dump($this->parameters);
if (count($paramMappings) != count($this->parameters)) {
throw QueryException::invalidParameterNumber();
}
变量$ paramMappings确实只包含一个映射,而$ this->参数包含两个参数。
这就是过滤器定义的样子:
src/WF/ReviewBundle/Admin/BaseReviewAdmin.php
public function configureDatagridFilters(DatagridMapper $grid)
{
$grid->add('berater_name', 'doctrine_orm_callback',
array('callback'=>function($queryBuilder, $alias, $field, $value) {
if(empty($value['value']))
return;
$queryBuilder->from('WFConsultantBundle:ConsultantHasReview', 'cr_')
->leftJoin('cr_.consultant', 'con')
->where(sprintf('cr_.review = %s', $alias));
$search = new \WF\WFAdminBundle\Search\SearchName();
$search($queryBuilder, 'con', $field, $value);
return true;
}));
$grid->add('sterne', 'doctrine_orm_callback',
array('callback'=>function($queryBuilder, $alias, $field, $value) {
if(empty($value['value']))
return;
$queryBuilder
->from('WFReviewBundle:ReviewParameters', 'pr')
->where(sprintf('pr.review = %s', $alias))
->andWhere('pr.recommendWorth = :stars')
->setParameter('stars', $value['value'])
->distinct(false);
return true;}));
$grid->add('institute_name', 'doctrine_orm_callback',
array('label'=>'Institut Name', 'callback'=>function($queryBuilder, $alias, $field, $value) {
if(empty($value['value']))
return;
$queryBuilder
->from('WFConsultantBundle:ConsultantHasReview', 'cr')
->from('WFInstituteBundle:OfficeHasInstitute', 'oi')
->leftJoin('cr.consultant', 'c')
->leftJoin('c.office', 'offi')
->leftJoin('oi.institute', 'i')
->where(sprintf('cr.review = %s', $alias))
->andWhere('oi.office = offi')
->andWhere('i.name = :institute')
->setParameter('institute', $value['value'])
->distinct(false);
return true;}));
$grid->add('consultant_id', 'doctrine_orm_callback', array('label'=>'Berater ID', 'callback'=>function($queryBuilder, $alias, $field, $value) {
if(empty($value['value']))
return;
$queryBuilder->from('WFConsultantBundle:ConsultantHasReview', 'cr_')
->leftJoin('cr_.consultant', 'con')
->where(sprintf('cr_.review = %s', $alias))
->andWhere('con.id = :consultant_id')
->setParameter('consultant_id', $value['value']);
return true;
}));
$grid->add('status');
$grid->add('id', null, array('label'=>'Bewertung ID'));
}
可以在此处找到所有三个实体及其映射定义(以注释格式): http://www.php-schulung.de/sonata-admin-filter-invalid-parameter-number-entities/
你知道如何让过滤器一起玩吗?
或者这是一个Sonata bug?
还是一个学说错误?
有什么想法吗?
答案 0 :(得分:1)
我有同样的问题。更改您的查询
-> where(sprintf('cr_.review = %s', $alias))
代表
-> andWhere(sprintf('cr_.review = %s', $alias))
您进入查询的中间,无法修改它。