根据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中的一个方法,以便能够在一个查询中获取所有权限。我怎么能这样做?
答案 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