【发布时间】:2016-09-08 10:56:03
【问题描述】:
我的User 实体实现了UserInterface,因此提供了getRoles() 方法。在我的系统中,一个User 可以属于多个Groups。一个组可以有多个角色。因此,可以通过收集所有组并合并这些组的角色列表来确定用户的角色。 FOSUserBundle 也可以做到这一点。
最简单的算法是:
public function getRoles()
{
$roles = $this->roles;
foreach ($this->getGroups() as $group) {
$roles = array_merge($roles, $group->getRoles());
}
return array_unique($roles);
}
我认为这个解决方案是有问题的,因为它的扩展性很差。对于每个组,必须执行一个新查询,因此查询的数量取决于组的数量。
通常我会通过定义一个查询来解决这个问题,该查询收集用户的所有组并加入组的角色。这将需要从 User 实体调用 UserRepository(或直接构建 Doctrine 查询),我认为这是一种不好的做法。
那么我怎样才能在保持单个连接查询的性能优势的同时避免这种不良做法呢?
(这一次我很难找到一个适合的问题标题。我不确定是否还有其他类似的情况,但我不这么认为,因为通常我会在存储库本身提供这样的方法. 在这种情况下,UserInterface 要求它在实体中)
【问题讨论】:
标签: performance symfony join doctrine-orm scalability