我正在使用symfony 4开发一个API,并使用像这样的实体地图(简化):
基本上,角色是操作的简单容器,因此最终用户更容易从UI授予或拒绝权限。
我知道如何通过注释(ORM,Serializer,...)返回所有使用其项目的帐户。
但我不知道如何在用户可以对他们进行的每项操作中返回所有帐户。我喜欢这样的回复:
[{
"id": 1,
"name": "Account 1",
"operations": [
"account.list",
"account.edit",
"account.grant"
]
}, {
"id": 2,
"name": "Account 2",
"operations": [
"account.list"
]
}]
我该怎么做:
感谢。
编辑:这是我在普通PHP中做的(未经测试):
public function findUserAccountsWithPermissions(int $userId)
{
$sql = "
SELECT
a.id,
a.name,
o.code
FROM Permission p
INNER JOIN Account a ON a.id = p.accountId
INNER JOIN Role_Operation ro ON ro.roleId = p.roleId
INNER JOIN Operation o ON o.id = ro.operationId
WHERE
p.userId = :userId
";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':userId', $userId, PDO::PARAM_INT);
$stmt->execute();
$accounts = [];
while ($row = $stmt->fetch()) {
$accountId = (int)$row['id'];
if (!isset($accounts[$accountId])) {
$accounts[$accountId] = [
'id' => $accountId,
'name' => $row['name'],
'operations' => [],
];
}
$accounts[$accountId]['operations'][] = $row['code'];
}
return array_values($accounts);
}
答案 0 :(得分:1)
我猜您正在寻找像这样的查询
内部PermissionRepository(我认为你有所有的映射信息)
public function findOperationAccountForUser(User $user)
{
$qb = $this->createQueryBuilder('p');
$qb->leftJoin('p.role', 'r')
->leftJoin('r.operations', 'op')
->leftJoin('p.account', 'a')
->where($qb->expr()->eq('p.user', ':user'))
->setParameter('user', $user)
->select('op.code, op.name,r.name, a.name,...');//or exclude for select all fields
return $qb->getQuery()->getResult();//or arrayResult as you want
}
希望它有所帮助!