Symfony2 Doctrine查询以左连接和对象为结果

时间:2014-06-01 19:58:27

标签: php mysql sql symfony doctrine-orm

我是新学说,现在我想做以下事。

table" user_friend":

id | user_id | friend_user_id

此表包含联系人列表的条目。

现在我想获得条目的结果,例如:

SELECT * FROM user_friend a 
    LEFT JOIN user_friend b
    ON (b.user_id = 10 AND b.friend_user_id = a.user_id)
WHERE b IS NULL

此查询将在那里从联系人列表中获取未被另一方的朋友确认的条目(WHERE b为空,他尚未添加" me"到他的联系人列表) 。 我希望你明白我在寻找什么。

我不确定WHERE b IS NULL是否正确或者如果已经存在另一个条目(表中已确认的朋友),如何检入一个查询,对此有什么正确的方法?我的想法就像左连接,你可以在上面看到。

其次,我不知道如何用Symfony2中的学说来做到这一点。 现在我知道EntityManager和 - > findBy方法。这个方法返回的对象很好。

我尝试了一下$ em-> createQueryBuilder()但我无法通过leftJoin到达我的目标。 在左连接的情况下是否必须使用createQueryBuilder,或者是否可以使用EntityManager执行此操作?我们也问:哪种方式更好? 第三,我不知道如何从createQueryBuilder中恢复实体对象。 - > getQuery() - >的getResult()。我必须给结果或其他东西补水吗?

这个代码的一个小例子非常好!

感谢。 晚上好。

1 个答案:

答案 0 :(得分:0)

在SQL中,你必须在WHERE语句中定义列的名称,而不是b IS NULL它必须是b.user_id IS NULL

SELECT * FROM user_friend a 
    LEFT JOIN user_friend b
    ON (b.user_id = 10 AND b.friend_user_id = a.user_id)
WHERE b.user_id IS NULL

使用NOT EXISTS

编写同一查询的另一种方法
SELECT * FROM user_friend a 
WHERE NOT EXISTS (
    SELECT * FROM user_friend b
    WHERE b.user_id = 10
    AND b.friend_user_id = a.user_id
)

使用NOT EXISTS

在DQL中使用相同的查询
$qb->select("a") 
   ->from("MyBundle\Entity\UserFriend a")
   ->where('NOT EXISTS (
        SELECT b
        FROM MyBundle\Entity\UserFriend b 
        WHERE b.user_id = :user_id
        AND b.friend_user_id = a.user_id   
   )')
   ->setParameter('user_id', 10);

在您的DQL中,请确保使用实体字段名称,这些名称可能不一定与您的数据库列名称相同(即,用户ID可能存储在名为' user_id'但实体& #39;字段名称可能只是' id'或' userId')