Доктрина не использует режим ленивой выборки по умолчанию в отношениях? - PullRequest
0 голосов
/ 29 октября 2018

У меня есть

User {
    ...
    /**
     * @var Country
     *
     * @ORM\ManyToOne(targetEntity="App\Entity\PersistenceModel\Country")
     */
    private $country;

} 

Я не совсем понимаю, как загружаются эти отношения:

ВОПРОС : как указано в документации Doctrine, типом извлечения отношений по умолчанию является Lazy. Это означает, что я должен ожидать второй запрос при запросе соответствующего элемента (в данном случае Страна). Тем не менее, я никогда не вижу этот второй запрос в моем журнале sql (даже если я делаю $user->getCountry()->getName() или $user->getCountry()), и вместо этого я вижу только запрос ниже. Как ни странно, моя сущность User имеет все данные без какого-либо очевидного второго запроса, и единственный запрос, который я вижу, не использует JOIN. Как это возможно?

 SELECT 
    t0.id AS id_1, 
    t0.name AS name_2, ...
    t0.country_id AS country_id_7 
 FROM user t0 
 WHERE t0.name = '....' 
 LIMIT 1

Чтобы убедиться в отсутствии проблем с моей конфигурацией журнала sql, я также использовал код php:

$this->em->getConnection()
        ->getConfiguration()
        ->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger())
    ;

При этом отображался тот же (и УНИКАЛЬНЫЙ) запрос, который я разместил выше

1 Ответ

0 голосов
/ 29 октября 2018

$user->getCountry() возвращает прокси и не приводит к запросу в базу данных. Это ленивый вызов по умолчанию.

Вы можете проверить это, запустив echo get_class($user->getCountry()); перед этим вызовом.

Если вы действительно хотите создать запрос, позвоните $user->getCountry()->getName() или любому другому получателю из этой сущности. $user->getCountry()->getId() будет работать без запроса, поскольку идентификатор уже известен из внешнего ключа.

...