List Symfony错误:路径表达式无效。必须是CollectionValuedAssociationField
我正在使用查询生成器设置与其他实体具有不同关系的文档列表。该列表还包括该查询生成器中所有实体的筛选表单 到目前为止,它对他们所有人都很有效,但我一添加$products实体,它就不再有效了 我的代码: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
$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);