我有这个
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())
;
这显示了我上面发布的相同(和唯一)查询
答案 0 :(得分:0)
$user->getCountry()
返回一个代理,并且不会导致对数据库的查询。这是默认的延迟调用。
您可以通过在调用之前运行echo get_class($user->getCountry());
来进行验证。
如果您确实要产生查询,请从该实体调用$user->getCountry()->getName()
或任何其他获取方法。 $user->getCountry()->getId()
可以在不进行查询的情况下工作,因为该ID已从外键得知。