gpt4 book ai didi

mysql - 将 native SQL 转换为 Doctrine 2 DQL - 自引用多对多

转载 作者:行者123 更新时间:2023-11-30 23:01:39 25 4
gpt4 key购买 nike

我正在尝试根据 native sql 查询生成 doctrine 2 DQL 查询:

SELECT f2.follower_id, u.*
FROM
users u,
user_followers f1
join user_followers f2 ON (f2.user_id = f1.follower_id AND f2.follower_id != f1.user_id )
WHERE f1.user_id = :user_id
AND u.id = f2.follower_id
AND f2.follower_id NOT IN (
SELECT follower_id
FROM user_followers
WHERE user_id = :user_id
)
GROUP BY 1
HAVING count(*) > 1

它基于具有自引用多对多关系的用户实体:

/**
* @ORM\ManyToMany(targetEntity="App\UserBundle\Entity\User", mappedBy="following")
*/
private $followers;

/**
* @ORM\ManyToMany(targetEntity="App\UserBundle\Entity\User", inversedBy="followers", cascade={"persist", "remove"})
* @ORM\JoinTable(name="user_followers",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="follower_id", referencedColumnName="id")}
* )
*/
private $following;

我完全被难住了,对如何实现它一无所知。任何帮助将不胜感激。

最佳答案

您需要将查询分为两部分。一种是让关注者 ID 在内部查询中检查 NOT IN。

首先获取关注者 ID,

下一个查询将是这样的,

$fid = $qb1->select('u.follower_id')
->from('UserFollowers','u')
->where('u.user_id = :ui')
->setParameter('ui', $user_id)

然后在下一个查询中,您需要将其传递到验证 NOT IN 的位置。 dql 将是这样的。

$dql = $qb2->select('f2.follower_id','u')
->from('Users','u')
->leftJoin('u.following', 'f2', Expr\Join::ON, 'f2.user_id = u.id')
->where('u.id = f2.follower_id')
->andWhere('f2.follower_id NOT IN :folid')
->setParameter('folid', $fid)
->groupBy(1)
->andHaving($qb2->expr()->count('u'), 0);

您可以从这里获得更多信息:- http://docs.doctrine-project.org/en/latest/reference/query-builder.html

关于mysql - 将 native SQL 转换为 Doctrine 2 DQL - 自引用多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23710963/

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