2016-08-28 3 views
1

моего лица пользователя имеет несколько ассоциацийполучить учение, чтобы выбрать объекты без всех ассоциаций

oneToMany: 
    images: 
     targetEntity: Image 
     mappedBy: user 
    posts: 
     targetEntity: Post 
     mappedBy: user 
     fetch: EXTRA_LAZY 
    postcomments: 
     targetEntity: Postcomment 
     mappedBy: user 
     fetch: EXTRA_LAZY 

я хочу, чтобы выбрать конкретный пользователь со всеми его постами и изображениями, но не его postcomments. Это вопрос, который я использую:

 $qb = $em->createQueryBuilder() 
     ->select(array('u', 'p', 'i')) 
     ->from('AppBundle:User', 'u') 
     ->leftJoin('u.posts', 'p') 
     ->leftJoin('u.images', 'i') 
     ->where('u.id = :id') 
     ->setParameter('id', $id); 

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

Как я могу выбрать только определенные ассоциации в результате?

Вот полный код апите вызов

public function getAction($id) 
{ 
    $em = $this->getDoctrine()->getEntityManager(); 

    $qb = $em->createQueryBuilder() 
     ->select(array('u', 'p', 'i')) 
     ->from('AppBundle:User', 'u') 
     ->leftJoin('u.posts', 'p') 
     ->leftJoin('u.images', 'i') 
     ->where('u.id = :id') 
     ->setParameter('id', $id) 
     ->getQuery(); 

    $users = $db->getOneOrNullResult(); 
    $view = $this->view($users); 

    return $this->handleView($view); 
}` 

ответ

1

Я думаю, что вы ввели в заблуждение ленивой функции загрузки Доктрины в.

Когда вы

$user->getPostcomments(); 

и возвращает вам коллекцию Postcomment с, это еще не означает, что он был получен с БД вместе с самим пользователем.

Lazy погрузка здесь. Это означает, что он загружен при первой попытке доступа к этой коллекции. Это не реально, пока вы его не используете. ;-)

По умолчанию Doctrine устанавливает fetch: LAZY режим, который работает, как указано выше. Вы использовали EXTRA_LAZY, который имеет некоторые дополнительные функции. В этом случае, когда вы пытаетесь получить доступ к определенному элементу коллекции (или фрагменту), Doctrine по-прежнему не будет загружать целую коллекцию, а только запрошенный элемент или подмножество, если он использует метод slice(). Иногда это полезно, но иногда это может быть причиной проблем с производительностью. Вы должны знать разницу между LAZY и EXTRA_LAZY.

+0

Благодарим вас за claryfying. Однако мне нужно вывести результат $ qb в api как json, и он будет - независимо от того, добавляю ли я объединение или не оставляю их - всегда выводят КАЖДЫЕ связанные сущности, связанные с пользователем, поэтому в основном, когда я просто хочу иметь json с пользователем и изображениями, я до сих пор получаю сообщения, посткомментарии и т. д. Даже если я просто «выберем u из AppBundle: User» или сделаю $ this-> getUser() и выведу на json, я получаю каждый другой связанный элемент в результате который является разновидностью огромного набора данных и раздражает. Отсюда мой первоначальный вопрос: как это можно предотвратить и выбрать только связанные вещи? – Sangit

+0

Предоставьте код, который показывает, как вы генерируете ответ json. –

+0

Я поставил полный код в вопрос – Sangit

Смежные вопросы