对 symfony 和 Doctrine 非常陌生。我的数据库中有以下表格。
mo_user
id | email | password
__________________________________
9144 | summer@h.com | !password!
mo_user_role
user_id| role_id
_________________
9144 | 5
mo_permission
id | namespace | name | description
______________________________________________
1 | admin | - | -
2 | users | - | -
3 | view_summary_report | - | -
4 | view_user_statement | - | -
mo_role_permission
role_id | permission_id
________________________
5 | 3
5 | 4
我试图返回当前用户的权限数组,在本例中为 id = 9144
的用户应该是array('view_summary_report','view_user_statement')
。
我已将所有表映射到其相应的实体类。并在 MoUser.php
对应mo_user
的实体类表,我有一个
应该返回数组的权限方法,但我从注释的连接失败,
我的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来实现我想要的,如下所示,但我想知道实现以下原始SQL的Symfony/Doctrine注释方法。
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;
最佳答案
我认为没有适当的方法可以直接通过当前设置的属性注释来实现您想要执行的操作。
您可以使用以下解决方案之一实现您想要的目标:
不需要
mo_user_role
和mo_role_permission
之一,因为它们都没有附加字段。您应该只有一个由MoUser
和MoPermission
之间的ManyToMany
关系生成的mo_user_permission
表,这将授予您直接从MoUser
的getPermissions()
访问 另一种方法是创建一个具有
GetPermissionsFromUser(MoUser $moUser)
方法(例如)的服务,从实体的存储库中调用正确的查询,您可以调用该查询需要时。您仍然可以使用当前的设置在
getPermissions()
方法中实现您想要的效果,但您必须循环遍历每个关系的项目才能手动构建新的结果数组。
MoPermission
例如最后一点:
public function getPermissions() {
$permissions = [];
foreach($this->roles as $role) {
foreach($role->getPermissions() as $permission) {
permissions[] = $permission->getNamespace();
}
}
return $permissions;
}
这假设您有一个 MoRole 实体,这对于您当前的设置来说是有意义的,但您没有提及它。否则,仍然可以应用相同的逻辑,这只是一个命名问题。
关于mysql - Symfony 4 Doctrine 多个表连接在一个属性中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50292220/