Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 4从联接表中查询元素(如果存在)_Php_Mysql_Doctrine_Symfony4 - Fatal编程技术网

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的语法问题,您的答案解决了我的问题,谢谢。