我想知道是否可以在学说查询构建器中检查一个数组是否包含另一个数组的任何元素.
就我而言,我想获得所有至少具有传递给参数的数组中类别之一的产品(项目).
Relationship between Item and Category :
/**
* @ORM\ManyToMany(targetEntity="Category")
* @ORM\JoinTable(name="items_categories",
* joinColumns={@ORM\JoinColumn(name="item_id", referencedColumnName="id", nullable=false)},
* inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id", nullable=false)}
* )
*/
private $categories;
My first try from the Item repository (i know this work if i have only
one value to check):
public function getListItemsFromCatList($listCat) {
$qb = $this->createQueryBuilder('i');
$qb->select('i')
->where($qb->expr()->like('i.categories', ':listCat'))
->setParameter('listCat', '%"' . $listCat . '"%');
return $qb->getQuery()->getResult();
}
$listCat是Category Entity的数组:
array (size=5)
0 =>
object(ItemBundle\Entity\Category)[518]
private 'id' => int 22
private 'children' =>
object(Doctrine\ORM\PersistentCollection)[520]
private 'snapshot' =>
array (size=2)
...
private 'owner' =>
&object(ItemBundle\Entity\Category)[518]
private 'association' =>
array (size=15)
...
private 'em' =>
object(Doctrine\ORM\EntityManager)[796]
...
private 'backRefFieldName' => string 'parent' (length=6)
private 'typeClass' =>
object(Doctrine\ORM\Mapping\ClassMetadata)[579]
...
private 'isDirty' => boolean false
protected 'collection' =>
object(Doctrine\Common\Collections\ArrayCollection)[515]
...
protected 'initialized' => boolean true
private 'parent' => null
private 'name' => string 'Luxe' (length=4)
1 =>
object(ItemBundle\Entity\Category)[504]
private 'id' => int 25
private 'children' =>
object(Doctrine\ORM\PersistentCollection)[505]
private 'snapshot' =>
array (size=0)
...
private 'owner' =>
&object(ItemBundle\Entity\Category)[504]
private 'association' =>
array (size=15)
...
private 'em' =>
object(Doctrine\ORM\EntityManager)[796]
...
private 'backRefFieldName' => string 'parent' (length=6)
private 'typeClass' =>
object(Doctrine\ORM\Mapping\ClassMetadata)[579]
...
private 'isDirty' => boolean false
protected 'collection' =>
object(Doctrine\Common\Collections\ArrayCollection)[500]
...
protected 'initialized' => boolean false
private 'parent' =>
object(ItemBundle\Entity\Category)[512]
private 'id' => int 23
private 'children' =>
object(Doctrine\ORM\PersistentCollection)[513]
...
private 'parent' =>
object(ItemBundle\Entity\Category)[518]
...
private 'name' => string 'Bijoux' (length=6)
private 'name' => string 'Bagues' (length=6)
解决方法:
我会解决它添加一个联接.
public function getListItemsFromCatList($listCat) {
$em = $this->getDoctrine()->getManager();
$qb = $em->createQueryBuilder();
$qb->select('i')
->from('AppBundle:Item', 'i')
->innerJoin('i.categories','cat')
->where('cat IN (:listCat)')
->setParameter('listCat', $listCat);
return = $qb->getQuery()->getResult();
}
请注意,此方法将过滤项目内部的类别.这意味着,当您尝试从给定项i $i-> getCategories()获取类别时,它将仅从i中返回与$listCat匹配的类别.
如果您需要使用每个项目的所有类别,即使那些与$listCat不匹配的类别也是如此.我建议您使用子查询进行过滤,并使用主查询返回完整的项目.如果您需要任何其他帮助,请发表评论.
标签:doctrine-orm,doctrine,symfony-3-1,arrays,php
来源: https://codeday.me/bug/20191111/2022655.html