Symfony Doctrine序列化深层关系

时间:2018-05-28 14:23:52

标签: symfony doctrine entity-relationship

我正在使用symfony 4开发一个API,并使用像这样的实体地图(简化):

simplified database structure

基本上,角色是操作的简单容器,因此最终用户更容易从UI授予或拒绝权限。

我知道如何通过注释(ORM,Serializer,...)返回所有使用其项目的帐户。

但我不知道如何在用户可以对他们进行的每项操作中返回所有帐户。我喜欢这样的回复:

[{
    "id": 1,
    "name": "Account 1",
    "operations": [
        "account.list",
        "account.edit",
        "account.grant"
    ]
}, {
    "id": 2,
    "name": "Account 2",
    "operations": [
        "account.list"
    ]
}]

我该怎么做:

  • 添加函数Account :: getOperations()调用OperationRepository :: findAllByAccount()?
  • 将OperationRepository注入控制器并手动获取操作并将它们分配给未由ORM映射的Accounts类中的属性?
我在那里有点迷失了。以前从未与ORM合作过......

感谢。

编辑:这是我在普通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);
}

1 个答案:

答案 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
    }

希望它有所帮助!