使用manyToMany关系选择实体限制关系深度

时间:2017-01-12 15:35:40

标签: symfony doctrine-orm

在我的应用中,我有用户。 每个用户都有一个角色(管理员,测试人员......) 每个角色可以有多个权限(主页视图,联系页面视图......)

所以,我有一个ManyToMany关系

因为我想从角色的权限和权限中获取角色,所以我有双向关系。

我想要的只是选择一个具有角色的权限

我的问题:当我获得权限时,它会获得每个角色及其角色的权限......

结果开始示例:

{
  "id": 4,
  "nom": "Accès au backoffice",
  "slug": "page-backoffice",
  "role": [
    {
      "id": 1,
      "libelle": "Administrateur",
      "permission": [
        {
          "id": 3,
          "nom": "Visualisation du stock global",
          "slug": "page-visu-stock-global",
          "role": [
            {
              "id": 2,
              "libelle": "Responsable d'exploitation",
              "permission": [
                {
                  .......

我想要的是:

{
  "id": 4,
  "nom": "Accès au backoffice",
  "slug": "page-backoffice",
  "role": [
    {
      "id": 1,
      "libelle": "Administrateur",
      "slug": "administrateur"
    },
    {
      "id": 2,
      "libelle": "Responsable d'exploitation",
      "slug": "responsable-exploitation"
    },
    ....

我该怎么做?

我的orm文件关系详情: Permissions.orm.yml:

manyToMany:
    role:
        targetEntity: Role
        cascade: {  }
        fetch: LAZY
        mappedBy: permission
        inversedBy: null
        joinTable: null
        orderBy: null

role.orm.yml:

 manyToMany:
    permission:
        targetEntity: Permissions
        cascade: {  }
        fetch: LAZY
        mappedBy: null
        inversedBy: role
        joinTable:
            name: role_permission
            joinColumns:
                -
                    name: role_id
                    referencedColumnName: id
            inverseJoinColumns:
                -
                    name: permission_id
                    referencedColumnName: id
        orderBy: null

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

大多数情况下,您不希望一次将所有实体暴露给您的api,尤其是在将相关实体暴露给其他实体时。

序列化组允许您选择要在api中公开的属性。通过这种方式,您可以避免在暴露相关实体时进入深层(例如,暴露其权限的角色暴露其角色,将其权限暴露给无限及更远)。

Symfony有一些关于what are serialization groupshow to enable and use serialization groups的文档。

答案 1 :(得分:-1)

以下是如何操作的示例:

use JMS\Serializer\Annotation\MaxDepth;

class User
{
    private $username;

    /** @MaxDepth(1) */
    private $friends;

    /** @MaxDepth(2) */
    private $posts;
}

class Post
{
    private $title;

    private $author;
}

对于控制器:

use JMS\Serializer\SerializationContext;

$serializer->serialize($data, 'json', SerializationContext::create()->enableMaxDepthChecks());

注意在序列化过程中有大约20个注释关键字来“过滤”数据。

示例来源:

http://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies#limiting-serialization-depth-of-some-properties