我在尝试使用 QueryBuilder 或 DQL 时遇到问题。
我有以下关系:
用户 <-1:n-> 配置文件 <-n:m-> 路由组 <-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());
}
}
出于显而易见的原因,我不能使用此代码,否则我的服务器会超载,哈哈。
我尝试了以下方法:
数据质量:
$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', '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();
但我得到了这个错误:
The parent object of entity result with alias 'r' was not found. The parent alias is 'rg'.
如果我将“->select('u, r')”更改为“->select('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.