【问题标题】:Translating native SQL to Doctrine 2 DQL - Self referencing many to many将本机 SQL 转换为 Doctrine 2 DQL - 自引用多对多
【发布时间】:2014-07-05 19:58:39
【问题描述】:

我正在尝试基于本机 sql 查询生成学说 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;

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

【问题讨论】:

    标签: mysql sql symfony doctrine-orm doctrine


    【解决方案1】:

    您需要将查询分成两部分。一种是让追随者 id 在内部查询中检查 NOT IN。

    以follower 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

    【讨论】:

    • 感谢您的帮助,但问题是我没有 UserFollowers 类,所以我真的不能像这样进行第一次查询。
    • 嗨弗拉基米尔。您的应用程序中不是 UserFollowers 实体吗?
    • 否,表 user_followers 是从自引用关系生成的。检查我发布的那些变量的注释。
    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    相关资源
    最近更新 更多