使用 Doctrine ORM DQL (NOT IN) 排除行
Posted
技术标签:
【中文标题】使用 Doctrine ORM DQL (NOT IN) 排除行【英文标题】:Exclude rows with Doctrine ORM DQL (NOT IN) 【发布时间】:2010-02-16 17:00:12 【问题描述】:我正在使用 codeigniter 和教义构建一个聊天应用程序。
表格: - 用户 - 用户角色 - 用户可用
关系: 一个用户有很多角色。 一个 user_available 有一个用户。
可供聊天的用户将在 user_available 表中。
问题: 我需要让所有 user_available 中没有 role_id 7 的用户加入。
所以我需要用 DQL 表达类似的东西(这甚至不是 SQL,只是用文字): SELECT * from user_available WHERE NOT user_available.User.Role.role_id = 7
真的坚持这个
编辑: 我猜我不清楚。这些表已经映射,Doctrine 为我完成了 INNER JOIN 工作。 我正在使用此代码来获取等待时间最长的管理员,但现在我需要用户:
$admin = Doctrine_Query::create()
->select('c.id')
->from('Chat_available c')
->where('c.User.Roles.role_id = ?', 7)
->groupBy('c.id')
->orderBy('c.created_at ASC')
->fetchOne();
现在我需要获取等待时间最长的用户,但这不起作用
$admin = Doctrine_Query::create()
->select('c.id')
->from('Chat_available c')
->where('c.User.Roles.role_id != ?', 7)
->groupBy('c.id')
->orderBy('c.created_at ASC')
->fetchOne();
【问题讨论】:
【参考方案1】:我意识到这个问题现在可能已经消失了,但我是这样为未来的读者做的:
$admin = Doctrine_Query::create()
->select('c.id')
->from('Chat_available c')
->leftJoin('c.User u')
->leftJoin('u.Roles r')
->where('r.role_id != ?', 7)
->groupBy('c.id')
->orderBy('c.created_at ASC')
->fetchOne();
【讨论】:
【参考方案2】:为此,您需要先加入表
使用内连接将 user_available.id 连接到 user.id
但是,我认为您可能错误地使用了 user_available 表。由于它与用户表是一对一匹配的,所以你的用户表中不能只有一个 is_available 字段吗?
【讨论】:
以上是关于使用 Doctrine ORM DQL (NOT IN) 排除行的主要内容,如果未能解决你的问题,请参考以下文章