Sonata管理过滤器:无效参数数:绑定变量数与令牌数不匹配


Sonata Admin Filter: Invalid parameter number: number of bound variables does not match number of tokens

以下例外…

Invalid parameter number:绑定的变量个数不匹配令牌数

…出现在Sonata管理当我过滤两个属性的两个不同的实体的一部分,每个需要一个doctrine_orm_callback。

具体来说,在下面的代码中,当我填写与"consultant_id"answers"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();
        }

变量$ parammapping确实只包含一个映射,而$this->parameters却包含了两个参数。

过滤器定义是这样的:

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/

你知道我怎样才能让滤镜一起发挥作用吗?

或者这是奏鸣曲的bug?

还是学说错误?

任何想法?

我也有同样的问题。修改查询

-> where(sprintf('cr_.review = %s', $alias))

-> andWhere(sprintf('cr_.review = %s', $alias))

你进入查询的中间,你不能修改它