쿼리 작성기를 사용하여 다른 엔터티와 다른 관계가있는 문서 목록을 설정하고 있습니다. 목록에는 해당 쿼리 작성기의 모든 엔터티에 대한 필터 양식도 포함됩니다. 지금까지는 모두 잘 돌아 갔지만 $ products 엔티티를 추가하자마자 더 이상 작동하지 않습니다. 내 코드 : 그래서 유형과 상태를 들면, 나는 시장, 항공사와 (괴수) 제품에 대한 ManyToOne 관계를 가지고 심포니 오류 : PathExpression이 잘못되었습니다. CollectionValuedAssociationField 여야합니다.
$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)
;
, 그것은 ManyToMany 관계입니다.
현재 코드 예외가 발생합니다 :이 약
[Semantical Error] line 0, col 237 near 'id AND d.active': Error: Invalid PathExpression. Must be a CollectionValuedAssociationField.
이상한 일을, 나는 또한 제품에 ManyToMany 관계가 다른 기업에 대한 다른 목록을 가지고, 그 목록이 작동하고 있다는 점이다. . 이것에 대해 또 이상한 : 다른 목록을 내 쿼리는 다음과 같습니다
$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());
}
그것은 시장에 대한 ManyToOne 여기에 제품에 대한 ManyToMany입니다 ..
내 문서에 대해 동일한 코드 (p.id in : (productIds) ...)를 시도했는데이 코드는 작동하기 때문에 적어도 더 이상 오류가 발생하지 않습니다. 하지만 시장 (항공사, 제품 등)에 대해 필터를 적용하면 더 이상 작동하지 않으므로 목록이 비어 있습니다. 두 번째 목록 필터링은 작동하고 있습니다. 그래서 나는 이것이 어디서 오는 것인지 정말로 모른다. 사전에 도움을 주셔서 감사합니다!
코드 업데이트
$qb = $em->createQueryBuilder();
$query = $qb->select('d', 'p', 'm', 'a')
->from('DocumentBundle:Document', 'd')
->innerJoin('d.products', 'p')
->innerJoin('d.markets', 'm')
->innerJoin('d.airlines', 'a')
->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('m.id IN (:marketIds)')
->setParameter('marketIds',$markets);
}
if(count($airlines) > 0){
$query->andWhere('a.id IN (:airlineIds)')
->setParameter('airlineIds',$airlines);
}
if(count($products) > 0){
$query->andWhere('p.id IN (:productIds)')
->setParameter('productIds',$products);
}
$query->andWhere('d.active = :archiveParam')
->setParameter("archiveParam", $archive ? 0 : 1);
dump($query->getQuery());
필터링 어떤 아이디어 .. 상태, 유형 및 시장 아니지만 항공사와 제품에 대한 작동합니까?
재현 문제가
그래서 이것은 내 filterform입니다 (불필요한 필터는 검은 색이다). 그들은 모두 다중 선택 드롭 다운입니다. 시장 및 상태를 필터링 할 때 목록은 특정 상태가 있거나 선택한 시장에 할당 된 문서로만 축소됩니다. ManyToMany 관계 (시장, 항공사 및 제품) 모두에 대해 나는 자신의 데이터베이스 테이블을 가지고 있으며 모두 데이터를 포함하고 있습니다. 흠 나는 그것을 알아 내기 위해 도움이 될만한 것이 무엇인지 모르겠다. 알려줘 !!
샘플 데이터는 다음과 같습니다. 문서 번호. 42는 항공사 LH 및 LX에, CA, MX 및 US 시장에, 그리고 Nr. 1. 시장 중 하나를 필터링하면 문서가 항상 목록에 나타납니다. 그러나 항공사 나 제품 중 하나를 필터링 할 때 목록이 비어 있습니다.
및 추가 편집 : 방금 전에 제품 필터를 추가했는데 그 전에 항공사 필터링이 실제로 작동했습니다. d.airlines의 멤버와 함께 '잘못된'쿼리를 사용했지만
참고 : 나는 이미 그런 식으로하지만 필터링이 더 이상 작동하지 않는 시도했다 .. 어쨌든 – sonja
참고 .. 내 코드를 업데이트하지만 여전히 작동하지 않습니다 : 내 대답은 확실히에서이 오류를 해결하여 질문. 다른 오류/질문이있는 경우 - 더 구체적으로 설명하십시오 (또는 다음 번에 내 의견을 읽으십시오). – svgrafov
왜 그렇게 심한가? – sonja