我想知道是否可以在doctrine查询构建器中检查数组是否包含另一个数组的任何元素。
在我的情况下,我希望获得在参数中传递的数组中至少有一个类别的所有产品(项目)。
项目与类别之间的关系:
/**
* @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;
我第一次尝试从Item存储库(我知道这项工作,如果我只有 一个要检查的值):
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是一个类别实体数组:
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)
答案 0 :(得分:3)
我会解决它添加连接。
wscat -l 43944
请注意,此方法将过滤项目内的类别。这意味着当您尝试从给定项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
不匹配。我建议您使用子查询进行过滤,并使用主查询返回完整项目。如果你需要任何进一步的帮助,请发表评论。
答案 1 :(得分:0)
请尝试使用这样的查询构建器:
$em = $this->getDoctrine()->getManager();
$qb = $em->createQueryBuilder();
$qb->select('i')
->from('AppBundle:Item', 'i')
->where('i.categories LIKE :listCat')
->setParameter('listCat', '%"' . $listCat . '"%');
return = $qb->getQuery()->getResult();
我认为这应该有效。我假设您使用的Doctrine中的实体名为Item
。
编辑#2 - 基于评论
您需要遍历数组并获取名称(我认为),我认为这是您正在寻找的类别。在此代码中,我展示了循环以创建$cats
变量,然后在IN
查询中使用该变量。
foreach ($listCat as $item){
$cats = $cats . "'" . $item.getName() . "'".',';
}
$cats = substr($cats, -1);
$em = $this->getDoctrine()->getManager();
$qb = $em->createQueryBuilder();
$qb->select('i')
->from('AppBundle:Item', 'i')
->where("i.categories IN (:listCat)")
->setParameter('listCat', $cats);
return = $qb->getQuery()->getResult();
你可以尝试一下吗?我想你需要这样的东西。