symfony4在一个属性中连接多个表

nnt7mjpx  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(314)

对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;

xpszyzbs

xpszyzbs1#

我很确定您可以使用条令(和查询生成器)来进行查询,比如。。。

use Doctrine\ORM\EntityRepository

class PermissionRepository extends EntityRepository
{
    //....

    /**
     * @param UserInterface $user
     * @return array|Permission[]
     */
    public function getPermissionsForUser(UserInterface $user)
    {
        $queryBuilder = $this->createQueryBuilder('permission');

        /**
         * permissions will be in a multi-dimensional array
         * with a single key per array of 'namespace'
         */
        $permissions = $queryBuilder
            ->select('permission.namespace')
            ->join('permission.role', 'role')
            ->join('role.user', 'user')
            ->where($queryBuilder->expr()->eq('user', ':user'))
            ->setParameter('user', $user)
            ->getQuery()
            ->getArrayResult();

        if (count($permissions) > 0) {
            /**
             * If there are any permissions found just return
             * the 'namespace' property from each "sub-array"
             */
            return array_column($permissions, 'namespace');
        }

        return ['DEFAULT_PERMISSION'];
    }

    //...
}

然后你会叫它像。。

$permissions = $repository->getPermissionsForUser($user);
ddarikpa

ddarikpa2#

我不认为有一个正确的方法来实现你要做的事情,直接通过属性注解与您当前的设置。
不过,您可以使用以下解决方案之一实现您的目标:
什么之中的一个 mo_user_role 以及 mo_role_permission 不需要,因为它们都没有附加字段。你应该好好休息一下 mo_user_permission 表格由 ManyToMany 关系 MoUser 以及 MoPermission ,这将允许您直接访问 MoPermissionMoUsergetPermissions() 另一种方法是创建一个具有 GetPermissionsFromUser(MoUser $moUser) 方法,从实体的存储库中调用适当的查询,需要时可以调用该查询。
你仍然可以实现你的梦想 getPermissions() 方法,但必须循环每个关系的项以手动构建新的结果数组。
e、 g.最后一点:

public function getPermissions() {
    $permissions = [];
    foreach($this->roles as $role) {
        foreach($role->getPermissions() as $permission) {
            permissions[] = $permission->getNamespace();
        }
    }
    return $permissions;
}

这将假设您有一个morole实体,这对于您当前的设置是有意义的,但是您没有提到它。否则,同样的逻辑仍然可以应用,这只是命名问题。

相关问题