Roles存储库Symfony用于加载角色实体

时间:2017-10-10 17:43:25

标签: php symfony doctrine symfony-2.7

根据Symfony Security章节,我在数据库中加载了我的用户和角色。用户实现AdvancedUserInterface,\ Serializable, 角色实现RoleInterface。 我的角色实体:

AppBundle\Entity\Roles:
   type:     entity
   table:     Roles
   repositoryClass: AppBundle\Repository\Roles
[...]
     oneToMany:
          users:
               targetEntity:     Users
               mappedBy:          role
               cascade:           [persist]
          privs:
               targetEntity:     RolesPrivileges
               mappedBy:          role
               cascade:           [persist]

我的RolesPrivileges实体与Roles的多对一关系以及与权限的相同关系:

AppBundle\Entity\RolesPrivileges:
     type:     entity
     table:     RolesPrivileges
     repositoryClass: AppBundle\Repository\RolesPrivileges
id:
    role:
           associationKey: true
           type:     integer
    privilege:
           type:     integer
           associationKey: true
 fields:
    related:
           type:     boolean
           nullable:   FALSE
           options:
                  default:    0
 manyToOne:
      role:
           targetEntity:     Roles
           inversedBy:      privs
           joinColumn:
                name:     role_id
                referencedColumnName:     id
      privilege:
           targetEntity:     Privileges
           joinColumn:
                name:     privilege_id
                referencedColumnName:     id

最后是Privileges实体:

AppBundle\Entity\Privileges:
     type:     entity
         table:     Privileges
         id:
[...]

       fields:
           short:
               type:     string
               length:    50
               nullable:    FALSE

我这样编写它是为了能够检查(在登录用户中)对Controller中每个操作的详细访问权限。我只是遍历与分配给用户的角色相关的权限。

问题是Symfony正在为Privileges表中的每个条目对db执行单独的查询。我通过使用查询获取所有内容并将其存储在受保护的变量中来修复它。

但我不知道如何解决当我从一个twig模板中迭代特权时使用Roles实体中定义的方法时出现的同样问题。我以为我可以重新定义RolesRepository中的一个方法,以便能够在一个查询中获取所有权限。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

默认情况下,Doctrine中的关系是延迟加载的。如果您总是希望在获取这些权限时加载权限,请将关系的加载类型配置为EAGER。

  

每当您查询具有持久关联的实体时   这些关联被映射为EAGER,它们将自动成为   与被查询的实体一起加载,因此立即加载   适用于您的应用程序。

http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#by-eager-loading

AppBundle\Entity\Roles:
    oneToMany:
        [...]
        privs:
            [...]
            fetch: EAGER

AppBundle\Entity\RolesPrivileges:
    [...]
    manyToOne:
        privilege:
            [...]
            fetch: EAGER