Symfony Doctrine使用ManyToMany关系创建查询

时间:2016-09-19 17:41:01

标签: php symfony doctrine-orm

我有关系ManyToMant照片和标签,我需要找到有一些标签id的照片,我尝试“in”功能,但是当我发送两个标签id(1,2)时,我有一张标签带有id的照片1.如何查找具有一些标签ID的照片?

这是我的实体

class Photo
{   
use Timestampable;

/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 * @Annotation\Groups({
 *     "get_photo"
 * })
 */
private $id;

/**
 * @var Tags[]|ArrayCollection
 * @ORM\ManyToMany(targetEntity="Tags", inversedBy="photo")
 * @Annotation\Type("Relation<AppBundle\Entity\Tags>")
 * @Annotation\SerializedName("tag_ids")
 * @Annotation\Accessor(setter="setSerializedTag")
 * @Annotation\Groups({
 *     "post_photo", "get_photo", "put_photo"
 * })
 */
protected $tags;

和标签

class Tags
{  
use Timestampable;

/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 * @Annotation\Groups({"get_tag"})
 */
private $id;

/**
 * @var Photo[]|ArrayCollection
 *
 * @ORM\ManyToMany(targetEntity="Photo", mappedBy="tags")
 */
protected $photo;

和我的查询,在$parameterBag->get('tag_ids')示例中[1,2]:

/**
 * {@inheritdoc}
 */
public function getPhotoByParameters(
    ParameterBag $parameterBag,        
) {
    $em = $this->getEntityManager();
    $qb = $em->createQueryBuilder();
    $qb
        ->select('p')
        ->from('AppBundle:Photo', 'p')
        ->leftJoin('p.tags', 't');

    if ($parameterBag->get('tag_ids') !== null
        && is_array($tagIds = $parameterBag->get('tag_ids'))
    ) {
        $qb->andWhere($qb->expr()->in('t.id', $parameterBag->get('tag_ids')));
    }

    $query = $qb->getQuery();
    $results = $query->getResult();

    return $results;
}

在结果之后,我需要有照片,标签1和标签ID 2.不仅标签为id 1 exanple或2

尝试时

            $andX = $qb->expr()->andX();
        foreach ($tagIds as $id) {
            $andX->add($qb->expr()->eq('t.id', $id));
        }
        $qb->andWhere($andX);

我有0张照片(当获得&gt; 1标签ID时),当get = 1标签ID时,我对我的照片有回复

当这样的尝试有类似“in”

的东西时
        $orX = $qb->expr()->orX();
        foreach ($tagIds as $id) {
            $orX->add($qb->expr()->eq('t.id', $id));
        }
        $qb->andWhere($orX);

来自查询

的一个或多个标签ID的照片

1 个答案:

答案 0 :(得分:0)

我解决了我的问题

        if ($parameterBag->get('tag_ids') !== null
        && is_array($tagIds = $parameterBag->get('tag_ids'))
    ) {
        $qb->andWhere($qb->expr()->in('t.id', $parameterBag->get('tag_ids')));
        $qb->groupBy('p.id');
        $qb->having('COUNT(t.id) = :tagIds');
        $qb->setParameter('tagIds', count($parameterBag->get('tag_ids')));
    }
  1. 首先我会过滤掉所有带有标签ID的照片 - 示例1和2
  2. 然后我检查照片是否有超出数量
  3. 那就是