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());
}
}
明らかな理由で、私はこのコードを使用できません。そうしないと、サーバー、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', '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.