Как предотвратить Доктрину от ленивой загрузки отношений один к одному? - PullRequest
6 голосов
/ 16 марта 2012

РЕДАКТИРОВАТЬ: Если у вас возникли аналогичные проблемы Эта тема будет вам интересна

У меня есть User и UserSettings с двусторонним отношением.Похоже, что даже если я не использую какие-либо значения UserSettings на своей странице, доктрина лениво загружает их в любом случае.

Это ожидаемое поведение?Почему Doctrine загружает эти данные, хотя я не использую их на своей странице?Если я не могу остановить его, мне придется присоединять этот UserSettings к пользователю каждый раз, когда я получаю объект пользователя, но это так не нужно.

Что я могу сделать, чтобы этого не случилось?

Код, который загружает данные:

->createQuery('SELECT p, u, s FROM TestPostBundle:Post p LEFT JOIN p.user u LEFT JOIN p.sub s WHERE p.id IN (:ids)')
->setParameter('ids', $ids)
->getResult();

В ветке я циклически перебираю сообщения и показываю данные публикации и связанного пользователя, но я никогда не запрашиваю переменные UserSettings, я вообще к ним не обращаюсь.

Ответы [ 2 ]

4 голосов
/ 10 марта 2014

Я видел этот вопрос в нескольких местах и ​​добавляю свой ответ здесь:

Я столкнулся с этой же проблемой и помню, что в учебнике symblog приведен пример уменьшения отложенной загрузки путем явного добавления левых объединений в ненужные таблицы. Кажется странным включать таблицы в объединение, когда вам вообще не нужны эти данные, но таким образом вы уменьшите все эти дополнительные запросы до 1, и он будет выполняться быстрее.

Поиск отложенной загрузки - примерно на 1/5 пути вниз http://tutorial.symblog.co.uk/docs/customising-the-view-more-with-twig.html

Чтобы исправить это для проблемы user / userdata, попробуйте добавить это в репозиторий пользователя и использовать всякий раз, когда вам нужно получить всех пользователей, даже если вы не хотите userdata. Это может быть улучшено путем выбора частичного: -> select ('частичный p. {User_id, name,}')

   public function getAll($limit = 500) {
       $qb = $this->createQueryBuilder('u')
          ->select('u', 'd')
          ->leftJoin('p.userdata', 'd')
       if (false === is_null($limit))
           $qb->setMaxResults($limit);
    return $qb->getQuery()->getResult();
    }

UPDATE
Учебное пособие по символам, похоже, не работает, и я пока оставляю здесь ссылку на случай, если она временная. Соответствующий код здесь в ответе.

1 голос
/ 16 марта 2012

Я тоже столкнулся с такой же проблемой. Кажется, что при запросе из обратной стороны доктрина также запрашивает сторону-владельца. См. это обсуждение .

...