2014-09-09 5 views
0

У меня есть небольшая проблема с получением результатов QueryBuilder. Im using Symfony 2.Получить результаты QueryBuilder multiple Joins

Моя проблема в том, что я пытаюсь получить данные из соединения. Отношение это нормально, но когда я пытаюсь получить информацию от B и C и D. Ну ... очевидно, не получается.

Таблицы

Пользователи Многие < -> Многие UsersType Многие < -> Многие CatUsersType Многие < -> Многие Приложения

стол
  • Пользователи имеет Пользователь
  • Приложения имеют Приложения
  • CatUsersType имеет тип пользователей для каждого приложения
  • UsersType имеет идентификатор пользователя и UserType

Это мой код:

$qb = $em->createQueryBuilder(); 
$users = $qb->select('a, b, c, d') 
    ->from('MyBundle:users', 'a') 
    ->innerJoin('MyBundle:userstype','b', 'WITH', 'b.iduser = a.id') 
    ->innerJoin('MyBundle:catuserstype','c','WITH', 'c.id = b.idusertype') 
    ->innerJoin('MyBundle:applications','d', 'WITH', 'd.id = c.idapp') 
    ->where('d.id = :app_id') 
    ->setParameter('app_id', $idapp) 
    ->getQuery() 
    ->getResult(); 
if (count($users) > 0) { 
    $i = 0; 
    $elements = array('data' => array()); 
    foreach ($users as $usr) { 
     $created = $usr->getCreated();//['date']; 
     if($created instanceof \DateTime){ 
      $created = $created->format('Y-m-d H:i:s'); 
     } 
     $tmp = [ 
      'username' => $usr->getUsername(), 
      'name' => $usr->getName() . ' ' .$usr->getLastname(), 
      'created'=> $created, 
      'myField'=> $usr->getIdusertype(), //Problems here 
      'myApp' => $usr->getIdapp(),   //And here idApp comes from c or d tables 
      'id' => $usr->getId() 
     ]; 
     array_push($elements['data'], $tmp); 
     $i++; 
    } 
    $response = $elements; 
} 

Edit:

Я получил тот же результат, изменяющий внутреннюю сторону налево или справа.

Попытка для вызова метода «getIdusertype» для пользователей класса, когда метод принадлежит классу userstype

Я нашел проблему. Отношения неправильные. Я бы исправил код и поделился правильным кодом. Спасибо всем

+0

Изменить innerJoin to leftJoin и посмотреть, поможет ли это. Мы можем немного доработать вещи. – Cerad

+0

Те же результаты. Попытка вызвать метод «getIdusertype» для пользователей класса, когда метод принадлежит классу userstype – manuerumx

+0

. Я предполагаю, что у вас есть проблемы с отношением и, возможно, запутывают идентификаторы с объектами. Просто используйте find для запроса одного пользователя без объединений. Затем убедитесь, что $ user-> getIdusertype() фактически возвращает объект UsersType. – Cerad

ответ

2

Проблема в том, что вы пытаетесь получить доступ к свойствам usertype и catuserstype непосредственно из объекта пользователя. И вторая проблема заключается в том, что ваш текущий код будет работать только для отношений «один-к-одному», но не для отношения «многие-ко-многим». Если бы различные отношения, код может быть

foreach ($users as $usr) { 
    $created = $usr->getCreated();//['date']; 
    if($created instanceof \DateTime){ 
     $created = $created->format('Y-m-d H:i:s'); 
    } 
    $tmp = [ 
     'username' => $usr->getUsername(), 
     'name' => $usr->getName() . ' ' .$usr->getLastname(), 
     'created'=> $created, 
     'myField'=> $usr->getUsertype()->getIdusertype(), 
     'myApp' => $usr->getUsertype()->getCatuserstype()->getIdapp(), 
     'id' => $usr->getId() 
    ]; 
    array_push($elements['data'], $tmp); 
    $i++; 
} 

но многие к многим больше как

foreach ($users as $usr) { 
    $created = $usr->getCreated();//['date']; 
    if($created instanceof \DateTime){ 
     $created = $created->format('Y-m-d H:i:s'); 
    } 
    foreach ($usr->getUsertype as $usertype) { 
     foreach ($usertype->getCatuserstype() as $catuserstype) { 
      $tmp = [ 
       'username' => $usr->getUsername(), 
       'name'  => $usr->getName() . ' ' .$usr->getLastname(), 
       'created' => $created, 
       'myField' => $usertype->getIdusertype(), 
       'myApp' => $catuserstype->getIdapp(), 
       'id'  => $usr->getId() 
      ]; 
     } 
    } 
    array_push($elements['data'], $tmp); 
    $i++; 
} 

или какой-либо другой способ объединения вашего $elements['data'] массива.

Edit:

я предположил в своем ответе, что есть правильные отношения, установленные для юридических лиц. Таким образом, вы сможете написать свой запрос, например

$users = $qb->select('a') 
    ->from('MyBundle:users', 'a') 
    ->innerJoin('a.userstype', 'b') 
    ->innerJoin('b.catuserstype', 'c') 
    ->innerJoin('c.applications', 'd') 
    ->where('d.id = :app_id') 
    ->setParameter('app_id', $idapp) 
    ->getQuery() 
    ->getResult(); 
Смежные вопросы