Utiliser JOIN dans Symfony2 / Doctrine SQL
J'ai un problème en essayant d'UTILISER QueryBuilder OU DQL.
J'ai la relation suivante:
Utilisateur <-1:n-> Profil de <-n:m-> RouteGroup <-1:n-> Route
Je voudrais faire un DQL la liste de tous les itinéraires qu'un utilisateur a accès.
Je peux obtenir cette information avec le code suivant:
$usr = $this->container->get('security.context')->getToken()->getUser();
foreach ($usr->getProfiles() as $profile){
foreach ($profile->getRoutegroups() as $routegroup){
var_dump($routegroup->getRoutes()->toArray());
}
}
Pour une raison évidente, je ne peux utiliser ce code, sinon je vais surcharger mon serveur, LOL.
J'ai essayé l'une des approches suivantes:
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 (j'ai essayé à l'aide de l'u.profils - le nom de la relation au lieu de l'entité - mais cela ne fonctionne pas aussi):
$em->createQueryBuilder()
->select('r')
->from('CRMCoreBundle:User', 'u')
->innerJoin('u.profiles','p')
->where('u.id = :user_id')
->setParameter('user_id', $user->getId())
->getQuery()
->getResult();
Quelqu'un peut-il aider svp???
Mise à JOUR: j'ai essayé Zeljko de la solution et de ce script:
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();
Mais j'ai eu cette erreur:
The parent object of entity result with alias 'r' was not found. The parent alias is 'rg'.
Si je change "->select('u, r')", "- >select('r')", j'obtiens ceci:
[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.
source d'informationauteur Marcelo Diotto
Vous devez vous connecter pour publier un commentaire.
Après avoir essayé quelques solutions de rechange, j'ai découvert que je pouvais faire une inversion de la recherche, en commençant à partir d'itinéraires pour les utilisateurs. La solution a été comme suit:
Dans votre DQL, l'extraction des utilisateurs, mais vous demandé comment extraire les routes. De ce fait, vous avez besoin?
De toute façon, dans RoutesRepository:
Je ne comprend pas la relation, mais je pense que vous pouvez le changer pour refléter votre code. Vous devez utiliser innerJoin, pas leftJoin.
Je ne suis pas un expert de la Doctrine, mais seulement de résoudre un problème très similaire. J'ai résolu mon problème en incluant toutes les entités que vous utilisiez dans les jointures dans la partie SELECT de la déclaration.
Je n'ai pas testé, mais cela devrait fonctionner.
Je ne sais pas exactement pourquoi, mais si vous n'incluez pas les entités de l'hydrateur ne sais pas à propos de l'alias que vous utilisez pour les entités.
J'espère que cette aide.