2015-06-23 2 views
0

Я читал о ленивых ассоциаций в Учении 2 и как я мог бы избежать следующей ситуации:Doctrine2 Ленивая Загрузка

Entity dump in twig template

В этом paragraph в документации объясняется, как включить ленивые ассоциации для вашей организации. Мне не хватает того, как я могу использовать это в моем репозитории объектов.

До сих пор я пытался внести некоторые корректировки в репозиторий объектов, но без каких-либо успехов. Я также пробовал this post, this post и this post, но они, похоже, справляются с ManyToMany или совершенно другой ситуацией.

Может ли кто-нибудь объяснить, как и где использовать ленивую ассоциацию, чтобы избежать приведенного выше примера?

Исключительные частные свойства и геттеры/сеттеры были удалены из этого фрагмента кода из-за длины.

SRC/AppBundle/Объект/news.php

class News 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Account", fetch="EXTRA_LAZY") 
    * @ORM\JoinColumn(name="author", referencedColumnName="id") 
    */ 
    private $author; 
} 

SRC/AppBundle/Объект/Хранилища/NewsRepository.php

class NewsRepository extends EntityRepository 
{ 
    /** 
    * @param $id 
    * @return mixed 
    * @throws \Doctrine\ORM\NonUniqueResultException 
    */ 
    public function findOneById($id) { 
     return $this->createQueryBuilder('a') 
        ->andWhere('a.id = :id') 
        ->setParameter('id', $id) 
        ->getQuery() 
        ->getOneOrNullResult(); 
    } 
} 

SRC/AppBundle/Контроллер/NewsController .php

/** 
* @Route("/{id}", name="news_item") 
* @Method({"GET"}) 
* @Template("AppBundle:news:item.html.twig") 
*/ 
public function articleAction(Request $request, $id) 
{ 
    $news_item = $this->getDoctrine()->getRepository('AppBundle:News')->findOneById($id); 

    if (!$news_item) { 
     throw $this->createNotFoundException('No news item found by id ' . $id); 
    } 

    return array(
     'news_item' => $news_item 
    ); 
} 

SRC/AppBundle/Ресурсы/мнения/Новости/item.html.twig

{% extends 'base.html.twig' %} 

{% block body %} 
    {{ dump(news_item) }} }} 
{% endblock %} 
+1

Я думаю, что 'dump (news_item)' делает прокси-решает автор. Попробуйте просмотреть журнал запросов в своей базе данных с дампом и без него. – user3557327

ответ

1

Вам не нужно делать ничего особенного, чтобы позволить отложенной загрузки. Дополнительная ленивая загрузка в отношениях, которые вы показываете, не нужна для того, чтобы News не загружал Автора. Это просто означает, что вы можете делать такие звонки, как -> содержит в коллекции, не загружая всю коллекцию & еще несколько удобств.

свалка() должен показать что-то на Автор вроде:

protected 'author' => 
    object(Proxies\__CG__\YourNamespace\YourBundle\Entity\Author) 

Это не означает, что объект был получен с БД. Процитировать the docs.

Вместо передачи вам настоящего экземпляра автора и коллекции комментарии Doctrine создаст для вас экземпляры прокси-сервера. Только если вы с обращаетесь к этим прокси в первый раз, они пройдут через EntityManager и загрузите свое состояние из базы данных.

Если вы не получили прокси-класс, это, вероятно, потому, что вы уже обращались к этим отношениям ранее в своем коде. Или вы явно выбрали этот объект в своем запросе.

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