Ich habe ein Problem beim Versuch, QueryBuilder oder DQL verwenden.Verwendung von JOIN in Symfony2/Doctrine SQL
Ich habe die folgende Beziehung:
Benutzer < -1: n-> Profil < -n: m-> RouteGroup < -1: n-> Route
Ich möchte einen DQL machen Das listet alle Routen auf, auf die ein bestimmter Benutzer Zugriff hat. Ich kann diese Informationen mit dem folgenden Code erhalten:
$usr = $this->container->get('security.context')->getToken()->getUser();
foreach ($usr->getProfiles() as $profile){
foreach ($profile->getRoutegroups() as $routegroup){
var_dump($routegroup->getRoutes()->toArray());
}
}
Aus offensichtlichen Grund, warum ich diesen Code verwenden kann nicht, sonst werde ich meinen Server überlasten, LOL.
ich folgende Ansätze versucht:
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 (i versucht u.profiles mit - den Namen der Beziehung anstelle des Unternehmens - aber auch nicht funktioniert):
$em->createQueryBuilder()
->select('r')
->from('CRMCoreBundle:User', 'u')
->innerJoin('u.profiles','p')
->where('u.id = :user_id')
->setParameter('user_id', $user->getId())
->getQuery()
->getResult();
Kann jemand bitte helfen ???
UPDATE: Ich Zeljko Lösung versucht und machte dieses Skript:
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();
Aber ich habe diesen Fehler:
The parent object of entity result with alias 'r' was not found. The parent alias is 'rg'.
Wenn i „ändern -> wählen ('u, r')“auf "-> wählen ('r')" ich bekomme diese:
[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.
Um Ihr Update zu beantworten, können Sie nicht nur u und r auswählen. Alles auf dem Weg zu r muss auch ausgewählt werden. also brauchst du wählen ('u, p, rg, r') – intrepion