我是新学说,现在我想做以下事。
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()。我必须给结果或其他东西补水吗?
这个代码的一个小例子非常好!
感谢。 晚上好。
答案 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
$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')