Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Symfony错误:路径表达式无效。必须是CollectionValuedAssociationField_List_Symfony_Filter_Doctrine_Query Builder - Fatal编程技术网

List Symfony错误:路径表达式无效。必须是CollectionValuedAssociationField

List Symfony错误:路径表达式无效。必须是CollectionValuedAssociationField,list,symfony,filter,doctrine,query-builder,List,Symfony,Filter,Doctrine,Query Builder,我正在使用查询生成器设置与其他实体具有不同关系的文档列表。该列表还包括该查询生成器中所有实体的筛选表单 到目前为止,它对他们所有人都很有效,但我一添加$products实体,它就不再有效了 我的代码: $qb = $em->createQueryBuilder(); $query = $qb->select('d', 'p') ->from('DocumentBundle:Document', 'd') ->i

我正在使用查询生成器设置与其他实体具有不同关系的文档列表。该列表还包括该查询生成器中所有实体的筛选表单

到目前为止,它对他们所有人都很有效,但我一添加$products实体,它就不再有效了

我的代码:

 $qb = $em->createQueryBuilder();
          $query = $qb->select('d', 'p')
          ->from('DocumentBundle:Document', 'd')
          ->innerJoin('d.products', 'p')
          ->orderBy('d.id', 'DESC')
          ->join('d.type', 'dt')
          ->join('d.status', 's');


        if(count($type) > 0){
          $query->andwhere($query->expr()->in('d.type', ':type'))
            ->setParameter('type',$type);
          }
          if(count($status) > 0) {
              $query->andWhere($query->expr()->in('d.status', ':status'))
              ->setParameter('status', $status);
          }

          if(count($markets) > 0){
            $query->andWhere(':marketIds MEMBER OF d.markets')
              ->setParameter('marketIds',$markets);
            }
            else{
            $query->andWhere(':marketIds MEMBER OF d.markets')
              ->setParameter('marketIds',$userMarkets);
            }

          if(count($airlines) > 0){
            $query->andWhere(':airlineIds MEMBER OF d.airlines')
              ->setParameter('airlineIds',$airlines);
            }else{
            $query->andWhere(':airlineIds MEMBER OF d.airlines')
              ->setParameter('airlineIds',$userAirlines);
            }

          if(count($products) > 0){
            $query->andWhere(':productIds MEMBER OF p.id')
              ->setParameter('productIds',$products);
            }
          //   else{
          //   $query->andWhere(':productIds MEMBER OF p.id')
          //     ->setParameter('productIds',$currentuser->getProducts());
          //   }

          $query->andWhere('d.active = ?1')
                ->setParameter(1, $archive ? 0 : 1);
          return $query
            ->setFirstResult($page * $maxRows - $maxRows)
            ->setMaxResults($maxRows)
            ;
因此,就类型和地位而言,我与市场、航空公司和(麻烦制造者)产品有着千丝万缕的关系

当前代码引发异常:

[语义错误]第0行,靠近“id和d.active”的第237列:错误: 无效的路径表达式。必须是CollectionValuedAssociationField

奇怪的是,我有另一个实体的列表,这个实体与产品也有很多关系,对于这个列表,它是有效的。这一点也很奇怪:对于另一个列表,我的查询如下所示:

 $qb = $em->createQueryBuilder();
    $query = $qb->select('a', 'p')
    ->from('AppBundle:Agency', 'a')
    ->innerJoin('a.products', 'p')
    ->orderBy('a.id', 'ASC');

    if(count($markets) > 0){
      $query->andWhere('a.market IN (:marketIds)')
        ->setParameter('marketIds',$markets);
      }
      else{
      $query->andWhere('a.market IN (:marketIds)')
        ->setParameter('marketIds',$currentUser->getMarkets());
      }

      if(count($products) > 0){
        $query->andWhere('p.id IN (:productIds)')
          ->setParameter('productIds',$products);
        }
        else{
        $query->andWhere('p.id IN (:productIds)')
          ->setParameter('productIds',$currentUser->getProducts());
        }
这里的市场和产品都有很多

我尝试在(:productIds)..中使用相同的代码(
p.id),这是一种工作方式,所以我至少不再收到错误。但是当我过滤一些东西(如市场、航空公司、产品等)时,它就不再起作用了,所以列表是空的。过滤第二个列表是可行的,所以我不知道这是从哪里来的

代码更新 过滤适用于状态、类型和市场,但不适用于航空公司和产品。有什么想法吗

复制问题

这就是我的FilterPerform(不必要的过滤器是黑色的)。它们都是多选下拉列表。在筛选市场和状态时,列表将减少为仅具有该特定状态或分配给所选市场的文档。对于所有许多关系(市场、航空公司和产品),我有自己的数据库表,它们都包含数据

样本数据如下:

第42号文件分配给LH和LX航空公司、CA、MX和美国市场以及第1号产品。因此,在筛选其中一个市场时,文档始终显示在列表中。但在筛选某家航空公司或产品时,列表将保持为空

编辑 我最近刚刚添加了产品过滤器,在我添加产品过滤器之前,航空公司的过滤器实际上工作得很好。尽管我对d.airlines的成员使用了“错误”的查询。

这部分

if(count($products) > 0){
    $query->andWhere(':productIds MEMBER OF p.id')
        ->setParameter('productIds',$products);
}
应该是这样的

if(count($products) > 0){
    $query->andWhere('p.id IN (:productIds) ')
        ->setParameter('productIds',$products);
}
您还混合了位置参数和命名参数

$query->andWhere('d.active = :archiveParam')
    ->setParameter("archiveParam", $archive ? 0 : 1);

注意:我说我已经试过了,但是过滤已经不起作用了。。无论如何,我更新了我的代码,但它仍然不起作用..注意:我的回答肯定会在您的查询中修复此错误。如果你有其他错误/问题-请更具体地解释它们(或者下次再看我的评论)。为什么这么恶劣?我必须等90分钟才能发布另一个问题。。如果您能在这里帮助我,以便我能够快速解决问题,我将非常感激。一旦我可以再次发布,我将发布问题,您可以再次在那里回答吗?非常感谢!好的,我会尽力的!给我一分钟:)
$query->andWhere('d.active = :archiveParam')
    ->setParameter("archiveParam", $archive ? 0 : 1);