php - 学说2 - 实体是以下组织的成员

标签 php mysql doctrine-orm

举个例子:

我有以下架构:

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/

相关文章:

doctrine-orm - 使用 Doctrine 2 MongoDbODM 模块进行身份验证

php - 如何使用 Doctrine 2 在 Zend Framework 2 中集成 Elasticsearch

php - Symfony2 学说 : How to select users that are not in groups with doctrine query builder

MySQL 允许用户使用 WHERE 但拒绝 SELECT

php - 圆形图像?

使用 FFMPEG 的 PHP 和 Mysql 当前视频持续时间

php - 有人可以清楚地解释为什么mysqli_prepare()/bind_param()比real_escape_string()更好吗?

mysql - 实现地理空间/邻近搜索需要什么?

java - 未在指定日期范围内获取 Jasper 报告

PHP 数组 : indexed vs keyed