Отключить автоматические запросы Doctrine - PullRequest
0 голосов
/ 25 февраля 2019

В Symfony 4.2 и Doctrine я хочу отключить автоматические запросы.

Если я выполню этот простой пример:

$posts = $em->getRepository(Post::class)->findAll();

foreach ($posts as $post) {
    dump($post->getCategory()->getName();
}

Doctrine будет искать категории самостоятельно. Но я хочу отключить это.заставить меня присоединиться ( ВЛЕВО или ВНУТРЕННИЙ в хранилище ) .

Это возможно?Спасибо

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Ничто не может автоматически отключить это поведение и заставить вас писать предложения JOIN, кроме ваших пожеланий.

Это поведение (которое называется отложенной загрузкой) является одним из основных общих действий всех ORM.

Если вас это не устраивает (и у вас, вероятно, есть веские причины), подумайте о написании собственных запросов DQL, ограниченных выбранными вами полями.То, что не содержится в вашем запросе, не будет автоматически выбрано впоследствии.

Запишите этот метод в свой пользовательский класс PostRepository:

public function findAll(){
    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb->select('p')
        ->from('Post', 'p');
    return $qb->getQuery()->getResult();
}

Затем в вашем контроллере вы можете сделать то же, что и раньше:

$posts = $em->getRepository(Post::class)->findAll();

foreach ($posts as $post) {
    dump($post->getCategory()->getName();
}

Вызов метода getName() из сущности Category теперь вызывает ошибку и не запускает никаких скрытых SQL-запросов.Если вы хотите играть с сообщениями и категориями вместе, то вы можете адаптировать свой метод findAll() следующим образом:

public function findAll(){
    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb->select('p, c')
        ->from('Post', 'p');
        ->join('p.category', 'c')
    return $qb->getQuery()->getResult();
}
0 голосов
/ 25 февраля 2019

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

...