-2
User:
id | name
1  | one
2  | two
3  | three
4  | four
5  | five


House:
id | name
1  | London
2  | Barcelona

UserHouse:
id_user | id_house
 1      |  1
 2      |  2
 4      |  1


$q = Doctrine_Query::create()
  ->from('User u')
   // many selectors here
  ->leftJoin('u.UserHouse uh')
  ->addWhere('????????');

$users = $q->execute();

我想获得所有没有 House 的用户(即 - 不在表 UserHouse 中) - 这应该返回我用户 3 和 5。

我知道,我可以使用:

->from('UserHouse uh')

以及与用户的下一个关系,但我必须拥有并使用:

  ->from('User u')

因为我将此查询与许多选择器一起使用 - 无法编辑它。我必须从 ->from('User u')开始

那么我必须填写->addWhere('????????')以使我返回没有房子的用户?

如果没有 Doctrine,我怎么能用简单的 SQL 来获得这个?

4

1 回答 1

1

在 SQL 中,这种类型的查询需要所谓的EXCEPTION JOIN. 一些 RDBMS 实际上将其实现为单独的类型(例如 DB2),而另一些则需要使用变通方法。在您的情况下,它相当于(在 SQL 中):

SELECT User.* 
FROM User
LEFT JOIN UserHouse
ON UserHouse.id_user = User.id
WHERE UserHouse.id_user IS NULL

将产生预期的“不在房子里”记录。

这个网站的很多地方都有类似的例子。

我从来没有使用过 Doctrine,所以我无法帮助你。但我最好的猜测是:

addWhere('uh IS NULL')

或者

addWhere('uh.id_user IS NULL')
于 2012-09-12T17:20:06.377 回答