我有两张表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();
与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();