symfony-join和in-query

z9gpfhce  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(258)

我想把一个sql查询转换成dql,dql提供了奇怪的行为。
我有这个sql

SELECT b_t.id
Inner Join tag_to_entry AS b_te ON b_t.id = b_te.tag_id
WHERE b_te.entry_id IN (
    SELECT a_te.entry_id
    FROM entry AS a_e
    Inner Join tag_to_entry AS a_te ON a_e.id = a_te.entry_id
    Inner Join tag AS a_t ON a_t.id = a_te.tag_id
    WHERE a_t.id = 9
)
AND b_te.tag_id != 9
GROUP BY b_t.id
HAVING COUNT(b_te.tag_id) > 2

这是我的存储库方法:(这是我尝试的)

public function findRelatedTagsByTag(Tag $tag)
{
    $in = $this->getEntityManager()->getRepository('AppBundle:Entry')
        ->createQueryBuilder('a_e')
        ->where(':tag MEMBER OF a_e.tags');

    $qb = $this->createQueryBuilder("b_t");
    $qb->innerJoin('b_t.entries', 'b_te')
        ->where($qb->expr()->in('b_te', $in->getDQL()))
        // ->andWhere(':tag NOT MEMBER OF b_te.tags')
        // ->groupBy('b_t.id')
        // ->having('COUNT(b_te.tags) > 2')
        ->setParameters(array('tag' => $tag)); // Tag with ID: 9
    return $qb->getQuery()->getResult();
}

如果我打电话 findRelatedTagsByTag() 所有参数都被注解掉(如上所述),我得到9条记录(没有任何重复)。如果我对sql执行相同的操作(也不带参数),它将返回34条记录(带重复项)。
如果我评论 ->groupBy('b_t.id') 返回9条记录。在sql中只有9。与repository方法中相同的9条记录。
如果我发表评论 ->andWhere(':tag NOT MEMBER OF b_te.tags') 返回0条记录。在我的SQL8记录中,这是正确的。
这个 ->having('COUNT(b_te.tags) > 2') 中的注解引发异常:
错误:路径表达式无效。应为statefieldpathexpression或singlevaluedassociationfield
我测试了两个子查询,它们返回相同的结果,所以没有错误。我怀疑dql组在没有我的语句的情况下很早就被注解了,这就发生了这种奇怪的行为。我希望有人能解释一下并帮助我。

xe55xuns

xe55xuns1#

经过6个小时的工作,我终于解决了这个问题:

$qb ->innerJoin('b_t.entries', 'b_te')
    ->where($qb->expr()->in('b_te', $in->getDQL()))
    ->andWhere('b_t.id != :id')
    ->groupBy('b_t.id')
    ->having('COUNT(b_t.id) > 2')
    ->setParameters(array('tag' => $tag, 'id' => $tag->getId()));

这个 ->andWhere 不需要 MEMBER OF 我得用身份证。
这个 ->having 不使用关系表。相反,它必须使用存储库实体。

相关问题