Tôi gặp sự cố khi cố gắng SỬ DỤNG QueryBuilder HOẶC DQL.Sử dụng JOIN trong Symfony2/Doctrine SQL
Tôi có mối quan hệ sau:
tài < -1: n> Hồ sơ < -n: m-> RouteGroup < -1: n> Route
Tôi muốn thực hiện một DQL liệt kê tất cả các tuyến đường mà một người dùng cụ thể có quyền truy cập. Tôi có thể nhận thông tin này bằng mã sau:
$usr = $this->container->get('security.context')->getToken()->getUser();
foreach ($usr->getProfiles() as $profile){
foreach ($profile->getRoutegroups() as $routegroup){
var_dump($routegroup->getRoutes()->toArray());
}
}
Vì lý do rõ ràng tôi không thể sử dụng mã này, nếu không tôi sẽ quá tải máy chủ, LOL.
Tôi đã thử các phương pháp sau đây:
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 (tôi đã cố gắng sử dụng u.profiles - tên của mối quan hệ thay vì thực thể - nhưng điều này không làm việc cũng):
$em->createQueryBuilder()
->select('r')
->from('CRMCoreBundle:User', 'u')
->innerJoin('u.profiles','p')
->where('u.id = :user_id')
->setParameter('user_id', $user->getId())
->getQuery()
->getResult();
Ai đó có thể giúp vui lòng ???
UPDATE: Tôi cố gắng giải pháp Zeljko và làm kịch bản này:
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();
Nhưng tôi đã nhận lỗi này:
The parent object of entity result with alias 'r' was not found. The parent alias is 'rg'.
Nếu tôi thay đổi "-> chọn ('u, r') "tới" -> chọn ('r') "tôi nhận được thông tin này:
[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.
Để trả lời cập nhật, bạn không thể chỉ chọn u và r .. mọi thứ trên đường đi đến r cũng phải được chọn. vì vậy bạn cần chọn ('u, p, rg, r') – intrepion