gpt4 book ai didi

mysql - Symfony Doctrine 加入和查询

转载 作者:行者123 更新时间:2023-11-29 10:26:23 32 4
gpt4 key购买 nike

我想将 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 条。与存储库方法中相同的 9 条记录。

如果我评论 ->andWhere(':tag NOT MEMBER OF b_te.tags') 返回 0 条记录。在我的 SQL 8 记录中,这是正确的。

注释中的 ->having('COUNT(b_te.tags) > 2') 抛出异常:

Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected

<小时/>

我测试了两个子查询,它们返回相同的结果,所以没有错误。我怀疑 DQL group by 太早并且没有评论我的语句,这会发生这种奇怪的行为。我希望有人能解释一下并帮助我。

最佳答案

经过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,我必须使用 ID。

->having 不使用关系表。相反,它必须使用存储库实体。

关于mysql - Symfony Doctrine 加入和查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48241524/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com