2016-07-07 31 views
-1

给定两个实体PermissionGroup及其关系实体GroupPermission,我想从任何Group对象中获得相关的Permission最佳实践:如何从一个实体获得相关实体

这里是我的实体(简化)说明:

---------- 
Permission 
---------- 
permissionId 
name 

----- 
Group 
----- 
groupId 
name 

---------------- 
GroupPermission 
---------------- 
groupPermissionId 
groupId 
permissionId 

除了我的三个文档类(描述PermissionGroupGroupPermission对象),我有三个仓库类(包含所有数据库相关逻辑)。

理想情况下,我希望能够做到$anyGroup->getPermissions(),并直接获取所有Permission对象。

由于实体应该对其存储库(以及其他实体存储库)一无所知,因此我不知道实现此类行为的最佳实践是什么。

编辑:继@KhorneHoly回答我补充一定限制:

我的文档类实现以易于序列化到JSON的JsonSerializable类。 因此,我有以下方法描述了如何做到这一点:

public function jsonSerialize() 
{ 
    return array(
     'groupId' => $this->getGroupId(), 
     'name' => $this->getName(), 
    ); 
} 

而且我想访问从那里权限,包括他们在JSON。

public function jsonSerialize() 
{ 
    return array(
     'groupId' => $this->getGroupId(), 
     'name' => $this->getName(), 
     'permissions' => $this->getPermissions() 
    ); 
} 

回答

0

你可以得到他们的标准库函数:

$em = $this->getDoctrine()->getManager(); 
$em->getRepository('permissions')->findBy(array('groupId' => $anyGroup->getId())); 

如果您要保存的权限为ArrayCollection,会有另一种方式。

$anyGroup->getPermissions(); 

但是,为了这个工作,你需要在添加关系时将权限添加到ArrayCollection

但是由于在添加关系时无法避免刷新实体,所以我总是喜欢使用Repository方式。

+0

我知道这种方法,但我有时需要直接在文档类中使用相同的行为。我已经按照编辑我的问题。 –

+0

@fef我看不到您的问题。如果您在控制器内部使用'json_serialize'函数,您只需从repo获得权限并将其添加到数组中。 – KhorneHoly

+0

由于此方法经常使用,因此我不需要手动添加它们。 特别是当我做一些像'返回新的JsonResponse(数组('组'=> $ arrayContainingMultipleGroups))' –