如果存在的话,Symfony 4可以从加入的表中查询元素。

问题描述 投票:0回答:1

我有两张表gift和gift_tags,我怎么能选择所有的礼品与标签,而不是在 $avoidTags 数组中,只有当礼物有标签时才会选择。现在我的查询方式是只选择在gift_tags表中至少有一个标签的礼物,而不是在 $avoidTags 数组,但我也需要那些没有标签的礼物。

$response = $qb
            ->select('g, tags')
            ->leftJoin('g.tags', 'tags')
            ->andwhere($qb->expr()->notin("tags.name", ":avoidTags"))
            ->setParameters(new ArrayCollection([
                new Parameter('avoidTags', $avoidTags),
            ]))
            ->getQuery()
            ->getResult();
php mysql doctrine symfony4
1个回答
1
投票

与mysql,它可以做这个查询。

SELECT 
  gift.*, tag.* 
FROM 
  gift 
LEFT JOIN tag ON gift.id = tag.gift_id
  WHERE gift.id NOT IN (
    SELECT g.id FROM gift AS g LEFT JOIN tag AS t ON g.id = t.gift_id WHERE t.name IN ('test', 'test2')
  )

所以,在学说QB的情况下,它也许是这样的。

 $subQb = $this->_em->createQueryBuilder()
            ->select('gift.id')
            ->leftJoin('gift.tags', 'tags')
            ->where($qb->expr()->orX(
                $qb->expr()->in("tags.name", ":avoidTags")),
            ))
            ->getQuery();

$response = $qb
        ->select('g, tags')
        ->leftJoin('g.tags', 't')
        ->where($qb->expr()->notin("g.id", $subQb->getDql())))
        ->setParameters(new ArrayCollection([
            new Parameter('avoidTags', $avoidTags),
        ]))
        ->getQuery()
        ->getResult();
© www.soinside.com 2019 - 2024. All rights reserved.