对symfony和教义来说很陌生。我的数据库中有以下表格。
MOU用户
id | email | password
__________________________________
9144 | summer@h.com | !password!
mo\用户\角色
user_id| role_id
_________________
9144 | 5
MOU权限
id | namespace | name | description
______________________________________________
1 | admin | - | -
2 | users | - | -
3 | view_summary_report | - | -
4 | view_user_statement | - | -
MOU角色权限
role_id | permission_id
________________________
5 | 3
5 | 4
我试图返回当前用户的权限数组,在本例中为id= 9144
哪个应该是 array('view_summary_report','view_user_statement')
.
我已经将所有表Map到它们相应的实体类。而且在 MoUser.php
对应于的实体类 mo_user
表中,我有一个应该返回数组的permissions方法,但我从注解的连接失败,
我的 getPermissions()
中的方法 MoUser.php
```
/**
- @var Collection|MoPermission[]
- @ORM\ManyToMany(targetEntity="App\Entity\MoPermission")
- @ORM\JoinTable(
name="mo_user_role",
joinColumns={@ORM\JoinColumn(name="user_id",referencedColumnName="id")},
inverseJoinColumns={@ORM\JoinColumn(name="role_id",referencedColumnName="id")}
- )
*/
private $permissions;
public function getPermissions()
{
$currentPermissions = array();
foreach ($this->permissions->toArray() as $index => $permission) {
$currentPermissions[] = $permission->getNamespace();
}
//Return default role if Roles are not assigned to this user.
if(count($currentPermissions)>0) {
return $currentPermissions;
} else {
return array('DEFAULT_PERMISSION');
}
}
所以我找到了原始sql来实现我想要的,下面是,但是我想知道symfony/条令注解的实现以下原始sql的方法。
SELECT t0.id AS id_1, t0.namespace AS namespace_2, t0.name AS name_3, t0.description AS description_4
FROM mo_permission t0
LEFT JOIN mo_role_permission ON t0.id = mo_role_permission.permission_id
LEFT JOIN mo_user_role ON mo_role_permission.role_id = mo_user_role.role_id
WHERE mo_user_role.user_id = 9144;
2条答案
按热度按时间xpszyzbs1#
我很确定您可以使用条令(和查询生成器)来进行查询,比如。。。
然后你会叫它像。。
ddarikpa2#
我不认为有一个正确的方法来实现你要做的事情,直接通过属性注解与您当前的设置。
不过,您可以使用以下解决方案之一实现您的目标:
什么之中的一个
mo_user_role
以及mo_role_permission
不需要,因为它们都没有附加字段。你应该好好休息一下mo_user_permission
表格由ManyToMany
关系MoUser
以及MoPermission
,这将允许您直接访问MoPermission
从MoUser
的getPermissions()
另一种方法是创建一个具有GetPermissionsFromUser(MoUser $moUser)
方法,从实体的存储库中调用适当的查询,需要时可以调用该查询。你仍然可以实现你的梦想
getPermissions()
方法,但必须循环每个关系的项以手动构建新的结果数组。e、 g.最后一点:
这将假设您有一个morole实体,这对于您当前的设置是有意义的,但是您没有提到它。否则,同样的逻辑仍然可以应用,这只是命名问题。