【发布时间】:2015-08-18 00:12:23
【问题描述】:
我有两张桌子:
用户问题
他们使用多对多关系表来跟踪哪个用户回答了哪个问题。
用户 用户问题 问题
现在我需要编写一个查询来获取特定用户 ID 尚未回答的所有问题。
以下本机查询工作正常:
SELECT * FROM questions q
WHERE q.id NOT IN (
SELECT question_id FROM users_questions
WHERE user_id = 4
);
但是我在这个查询中直接访问了 UsersQuestions 表,我还没有在 Doctrine 中找到这样做的方法,我什至认为这不可能。
访问该表的唯一方法是加入我的 Question 类的属性,因此我尝试将查询重写为以下查询,它也可以作为本机查询正常工作:
SELECT * questions q
LEFT JOIN users_questions uq
ON q.id = uq.question_id AND uq.user_id = 4
WHERE uq.user_id IS NULL;
我假设我可以简单地将其重写为 DQL,如下查询:
SELECT q FROM MyBundle:Question q
LEFT JOIN q.usersAnswered uq WITH uq.id = 4
WHERE uq.id IS NULL
当我调用 $query->getSql() 时,我得到以下输出:
SELECT * FROM mybundle_questions g0_
LEFT JOIN users_questions u2_
ON g0_.id = u2_.question_id
LEFT JOIN mybundle_users g1_
ON g1_.id = u2_.user_id AND (g1_.id = 4)
WHERE g1_.id IS NULL
鉴于我对 Doctrine 和一般查询的基本知识,这对我来说看起来不错。但是,这会获取并返回表中的所有问题,而不仅仅是该用户尚未回答的问题。
我是不是在某个地方犯了错误?或者有没有其他/更简单的方法来获取这些未回答的问题?我觉得我在这里重新发明轮子。
几天来一直坚持这一点,我在本机 SQL 中所做的每一次尝试都运行良好,但我无法将其转换为 DQL。任何帮助将不胜感激。
【问题讨论】:
-
来自 Doctrine 网站:初学者的一个常见错误是将 DQL 误认为只是某种形式的 SQL,因此尝试在查询中使用表名和列名或将任意表连接在一起。您需要将 DQL 视为对象模型的查询语言,而不是关系模式。
-
我知道这一点。据我所知,我没有在这里犯这个错误。在我的第三个查询中,我从对象模型的角度正确地实现了连接,而不是传统的表。在传统查询中,uq.id 指的是 UsersQuestions 的行 id,因此该查询根本不会在那里工作。但是它确实有效,因为 DQL 的逻辑是如何工作的,所以我认为我的概念是正确的。但我还缺少其他东西。
-
如果有人告诉我为什么我的问题被否决了,那就太好了。
-
不是 mysql 问题是我投反对票的原因
标签: mysql doctrine-query