我有两个实体,用户和客户端,一个客户端可以有很多用户。
通常我想拥有一个用户实体并延迟加载客户端但由于某种原因,当我尝试访问其属性时,客户端代理不会加载自身。
如果我像这样\Doctrine\Common\Utils\Debug::log($user->client);
转储数据,它将输出客户端代理及其客户端ID。
如果我将获取策略更改为“EAGER”,我将使客户端实体保持原样,但是当我访问用户时,我并不总是需要客户端实体,所以我更倾向于使用LAZY加载(如果可能的话)。
修改
当我稍后这样做时:
$user->client->name
即使我的代理获得了客户端ID,我也会回来。
这是我的两个关系(在注释中):
// user annotation
/**
* @var Entities\Client
*
* @ManyToOne(targetEntity="Client", inversedBy="users", fetch="LAZY")
*/
private $client;
// client annotation
/**
* @var Entities\User
*
* @OneToMany(targetEntity="User", mappedBy="client", cascade={"all"}, fetch="LAZY")
*/
private $users;
修改
我发现为什么它不起作用,我的所有注释扩展了一个基础注释,然后基础注释有一个getter和一个在代理类中使用时失败的setter。
答案 0 :(得分:6)
您永远不应将Doctrine中映射的属性定义为public。相反,您应始终将它们定义为受保护或私有,然后使用getter和setter访问它们。通过这种方式,Doctrine可以定义一个代理类,它可以重新定义"那些getter和setter(从而允许延迟加载)。
如果您直接访问该属性(就像您在$user->client->name
中所做的那样),则Doctrine无法拦截该调用。