小编Mar*_*tto的帖子

在Symfony2/Doctrine SQL中使用JOIN

我在尝试使用QueryBuilder或DQL时遇到问题.

我有以下关系:

用户<-1:n-> Profile <-n:m-> RouteGroup <-1:n-> Route

我想创建一个DQL,列出特定用户有权访问的所有路由.我可以使用以下代码获取此信息:

$usr = $this->container->get('security.context')->getToken()->getUser();
foreach ($usr->getProfiles() as $profile){
    foreach ($profile->getRoutegroups() as $routegroup){
        var_dump($routegroup->getRoutes()->toArray());
     }
}
Run Code Online (Sandbox Code Playgroud)

由于显而易见的原因,我无法使用此代码,否则我将重载我的服务器,大声笑.

我尝试了以下方法:

DQL:

$em->createQuery('SELECT p FROM CRMCoreBundle:User u
                  JOIN CRMCoreBundle:Profile p
                  JOIN CRMCoreBundle:RoleGroup rg
                  JOIN CRMCoreBundle:Role r
                  WHERE
                    u.id=:user')
        ->setParameter('user', $user->getId())
        ->getResult();
Run Code Online (Sandbox Code Playgroud)

QueryBuilder(我尝试使用u.profiles - 关系的名称而不是实体 - 但这也不起作用):

$em->createQueryBuilder()
        ->select('r')
        ->from('CRMCoreBundle:User', 'u')
        ->innerJoin('u.profiles','p')
        ->where('u.id = :user_id')
        ->setParameter('user_id', $user->getId())
        ->getQuery()
        ->getResult();
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗???

更新:我尝试了Zeljko的解决方案并制作了这个脚本:

    return $this->getEntityManager()
        ->createQueryBuilder()
        ->select('u, r')
        ->from('CRMCoreBundle:User', 'u')
        ->innerJoin('u.profiles','p')
        ->innerJoin('p.routegroups','rg')
        ->innerJoin('rg.routes','r')
        ->where('u.id = :user_id')->setParameter('user_id', $user->getId())
        ->getQuery()
        ->getResult(); …
Run Code Online (Sandbox Code Playgroud)

php doctrine dql query-builder symfony

14
推荐指数
1
解决办法
5万
查看次数

如何在数据库中存储Symfony2"access_control"信息?

我正在使用Symfony2,我的用户和角色已存储在我的数据库中.如果我设置类似下面的东西,security.yml那么效果很好:

access_control:
   - { path: ^/admin, role: ROLE_ADMIN}
   - { path: ^/users, role: ROLE_MANAGER}
Run Code Online (Sandbox Code Playgroud)

但我想将此access_control信息存储在数据库中,因此我系统中的用户可以使用管理界面更改权限本身.

我查看了ACL和FOSUserBundle但无法找到解决方案.我发现我可以用类似的东西检查权限,if ($user->hasRole($role))但我需要在每个控制器中执行此操作.

有没有办法定义动态"access_control"功能?也许就像将access_control重定向到某个可能返回true或false的类.有解决方案吗

php symfony

8
推荐指数
1
解决办法
2223
查看次数

标签 统计

php ×2

symfony ×2

doctrine ×1

dql ×1

query-builder ×1