php – 在Symfony2 / Doctrine SQL中使用JOIN

前端之家收集整理的这篇文章主要介绍了php – 在Symfony2 / Doctrine SQL中使用JOIN前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
尝试使用QueryBuilder或DQL时出现问题.

我有以下关系:

用户< -1:n->个人资料< -n:m-> RouteGroup< -1:n->路线

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

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

显而易见,我不能使用这个代码,否则我将超载我的服务器,LOL.

我尝试了以下方法

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();

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();

有人可以帮忙吗?

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

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

但是我收到这个错误

The parent object of entity result with alias 'r' was not found. The parent alias is 'rg'.

如果我更改“ – >选择(‘u,r’)”到“ – >选择(‘r’)”我得到这个:

[Semantical Error] line 0,col -1 near 'SELECT r FROM': Error: Cannot select entity through identification variables without choosing at least one root entity alias.
在尝试了一些替代方案后,我发现我可以进行反向查找,从路由到用户.解决方案如下:
return $this->getEntityManager()
        ->createQueryBuilder()
        ->select('r')
        ->from('CRMCoreBundle:Route','r')
        ->innerJoin('r.routegroup','rg')
        ->innerJoin('rg.profiles','p')
        ->innerJoin('p.users','u')
        ->where('u.id = :user_id')
        ->setParameter('user_id',$user->getId())
        ->getQuery()
        ->getResult();
原文链接:https://www.f2er.com/php/131073.html

猜你在找的PHP相关文章