在关系中,Doctrine默认不使用懒惰获取模式吗?

时间:2018-10-29 13:01:05

标签: php doctrine

我有这个

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 :(得分:0)

$user->getCountry()返回一个代理,并且不会导致对数据库的查询。这是默认的延迟调用。

您可以通过在调用之前运行echo get_class($user->getCountry());来进行验证。

如果您确实要产生查询,请从该实体调用$user->getCountry()->getName()或任何其他获取方法。 $user->getCountry()->getId()可以在不进行查询的情况下工作,因为该ID已从外键得知。