mysql - Symfony 4 Doctrine 多个表连接在一个属性中

标签 mysql symfony doctrine-orm doctrine symfony4

对 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_rolemo_role_permission 之一,因为它们都没有附加字段。您应该只有一个由 MoUserMoPermission 之间的 ManyToMany 关系生成的 mo_user_permission 表,这将授予您直接从 MoUsergetPermissions()

  • 访问 MoPermission
  • 另一种方法是创建一个具有 GetPermissionsFromUser(MoUser $moUser) 方法(例如)的服务,从实体的存储库中调用正确的查询,您可以调用该查询需要时。

  • 您仍然可以使用当前的设置在 getPermissions() 方法中实现您想要的效果,但您必须循环遍历每个关系的项目才能手动构建新的结果数组。

例如最后一点:

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/

相关文章:

php - Symfony2 Elastica bundle (elasticsearch)-可能仅限制 'active'项目?

mysql - ubuntu上的网站突然运行缓慢

java - 不完整的结果集数据

symfony - class 和 data_class 实体字段选项的区别

php - Doctrine2 刷新单个删除的实体

mysql - 对连接数据进行排序

php - 如何在 Doctrine 中进行左连接?

php - 我应该如何将琐碎的数据存储在数据库中?

php - mySQL 连接 3 个没有关系的表并从中获取最后的数据

php - 提交后取消设置 Symfony 表单中的字段