举个例子:
我有以下架构:
users(id, name)
groups(id,name)
user_groups(user_id, group_id)
我想获取属于某个组的用户。问题是,我知道组 ID,所以我不想加入组表 - user_groups 就足够了。
结果应该是
SELECT * FROM `users` AS u
LEFT JOIN `user_groups` AS ug ON (ug.`user_id` = u.`id)
WHERE ug.`group_id` = X
// i know the value of X
我在doctrine2中的尝试导致了groups
表的另一个连接。
我得到的最接近的是:
SELECT u FROM models\User u WHERE ?1 MEMBER OF u.groups
但它也会在“WHERE EXISTS(...)”内左连接
这可以在没有 native 查询(使用 DQL/查询生成器)的情况下完成吗?
最佳答案
ORM 相对于 ActiveRecord 模式的优点之一是,您不需要为连接表创建新实体。
所以这里当你使用Doctrine时,user_groups
表将在两侧进行映射。
这意味着您无法直接访问 user_groups 表。除非你使用 native sql,我强烈建议不要这样做。
因此,解决您的情况的最佳方法是在组存储库上使用 findOneBy($group_id)
并从中获取用户。这是理论上正确的实现方法。
-- 编辑-- 对于您的评论:
是的,我同意纯 db POV 的效率更高。
但是如果没有 native 查询,您将无法做到这一点,因为 DQL、查询生成器和与学说相关的所有内容都使用实体来执行操作,并且由于您在设计上使用 ORM,因此您不会有用于 Join 的实体表。
否则,唯一的方法是将映射从使用连接表的从用户到组的多对多关系
更改为从用户到user_groups的一对多关系以及多-从 user_groups 到 groups 的一对一
。这样您将拥有一个 user_groups
实体。
然后您可以直接使用该实体来获取用户。
尽管它是一个 hack,但这样使用在技术上和理论上都是不正确的。当然,除非连接表还有其他职责。
关于php - 学说2 - 实体是以下组织的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7883837/