Php Symfony 4从联接表中查询元素(如果存在)
我有两个表-礼品和礼品标签-只有当礼品有标签时,我如何选择所有带有标签的礼品,这些标签不在Php Symfony 4从联接表中查询元素(如果存在),php,mysql,doctrine,symfony4,Php,Mysql,Doctrine,Symfony4,我有两个表-礼品和礼品标签-只有当礼品有标签时,我如何选择所有带有标签的礼品,这些标签不在$avoidTags数组中。现在我的查询工作方式是,它只选择礼品标签表中至少有一个标签的礼品,而不在$avoidTags数组中,但我还需要那些根本没有标签的礼品 $response=$qb ->选择('g,tags') ->leftJoin('g.tags','tags') ->andwhere($qb->expr()->notin(“tags.name”,“avoidTags”)) ->设置参数(新的Ar
$avoidTags
数组中。现在我的查询工作方式是,它只选择礼品标签表中至少有一个标签的礼品,而不在$avoidTags
数组中,但我还需要那些根本没有标签的礼品
$response=$qb
->选择('g,tags')
->leftJoin('g.tags','tags')
->andwhere($qb->expr()->notin(“tags.name”,“avoidTags”))
->设置参数(新的ArrayCollection([
新参数('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();
问题是,如果礼物有两个或多个标记,其中一个来自“避免列表”,它将打印此礼物,因为它找到了其他标记。@serj我更新了答案,我测试了SQL查询,但没有测试查询生成器。除了一些带有括号和子查询中不必要的orX的语法问题,您的答案解决了我的问题,谢谢。