我有两个实体,用户和客户端,一个客户端可以有多个用户。
通常我想有一个用户实体并延迟加载客户端,但由于某些原因,当我试图访问其属性时,客户端代理不加载自己。
如果我像这样转储数据DoctrineCommonUtilsDebug::log($user->client);
,它将输出带有客户端id的客户端代理。
如果我将抓取策略更改为"EAGER",我将获得完整的客户端实体,但当我访问用户时并不总是需要客户端实体,所以如果可能的话,我宁愿使用LAZY加载。
编辑
当我稍后这样做时:
$user->client->name
我将得到null返回,即使我的代理得到一个客户端id。
这是我的两个关系(在注释中):
// user annotation
/**
* @var EntitiesClient
*
* @ManyToOne(targetEntity="Client", inversedBy="users", fetch="LAZY")
*/
private $client;
// client annotation
/**
* @var EntitiesUser
*
* @OneToMany(targetEntity="User", mappedBy="client", cascade={"all"}, fetch="LAZY")
*/
private $users;
编辑
我发现了为什么它不起作用,我所有的注释都扩展了一个基注释,基注释有一个getter和一个setter,当在代理类中使用时失败。
永远不要将Doctrine中映射的属性定义为public。相反,您应该始终将它们定义为受保护或私有,然后使用getter和setter来访问它们。这样,Doctrine就可以定义一个代理类来"重新定义"那些getter和setter(从而允许延迟加载)。
如果你直接访问属性(就像你在$user->client->name
中所做的那样),Doctrine没有办法拦截该调用