Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony使用哪种角色存储库方法加载角色实体_Php_Symfony_Doctrine_Symfony 2.7 - Fatal编程技术网

Php Symfony使用哪种角色存储库方法加载角色实体

Php Symfony使用哪种角色存储库方法加载角色实体,php,symfony,doctrine,symfony-2.7,Php,Symfony,Doctrine,Symfony 2.7,根据Symfony安全章节,我在数据库中加载了我的用户和角色。用户实现AdvancedUserInterface,\Serializable, 角色实现角色接口。 我的角色实体: AppBundle\Entity\Roles: type: entity table: Roles repositoryClass: AppBundle\Repository\Roles [...] oneToMany: users:

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

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]
AppBundle\Entity\Privileges:
     type:     entity
         table:     Privileges
         id:
[...]

       fields:
           short:
               type:     string
               length:    50
               nullable:    FALSE
我的RolePrivileges实体与角色的多对一关系以及与特权的同一种关系相关联:

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
最后,特权实体:

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]
AppBundle\Entity\Privileges:
     type:     entity
         table:     Privileges
         id:
[...]

       fields:
           short:
               type:     string
               length:    50
               nullable:    FALSE
我这样写是为了能够检查(登录用户)对控制器中每个操作的详细访问权限。我只需遍历与分配给用户的角色相关的特权

问题是Symfony正在对数据库中特权表中的每个条目进行单独的查询。我在控制器中修复了它,通过使用查询获取所有数据并存储在受保护的变量中


但我不知道如何解决从细枝模板(使用角色实体中定义的方法)迭代权限时出现的相同问题。我想我可以重新定义RolesRepository中的一个方法,以便能够在一个查询中获取所有权限。我该怎么做呢?

默认情况下,在条令中,这些关系是延迟加载的。如果总是希望在获取特权和角色时加载这些特权,请将关系的加载类型配置为“急切”

无论何时查询具有持久关联和 这些关联映射为“渴望”,它们将自动 与被查询的实体一起加载,因此立即 适用于您的应用程序


我想到的唯一解决方案(而且很难看)是重新定义控制器的render()方法,并将privileges变量(以前从db中填充,一个查询)传递给twig模板并进行迭代。但我正在寻找更好的解决方案。谢谢你@Stefano。正如您在RolePrivileges实体代码片段中看到的,我有额外的字段,因此我需要有单独的实体。另外,不fetch:EAGER只是让关联的实体立即加载,但仍在单独的查询中?我只是想减少查询的数量…我没有注意到中间实体中的附加字段,对此很抱歉。顺便说一句,默认情况下,条令执行查询以获取集合的每条记录。如果您(例如)只想计算集合的项数,EXTRA_LAZY将跳过所有记录的加载。最后,通过在一个查询中加载所有行来获取实体。我已经测试了EAGER-loading,但不幸的是,它仍然一个接一个地加载所有行(如果您想知道我为什么要修复这个问题,它有100多个查询)。也许正是我使用数据(迭代)的方式使doctrine query db如此。你认为它使用的方法是findOneBy吗?我想在我的Repository类中重新定义它。正在逐个加载哪些实体?角色特权还是特权实体?因为我在不同的项目中多次使用了eanger,我相信它是有效的,所以也许在你的代码中我遗漏了一些东西特权实体正在一个接一个地加载。