Doctrine 2延迟加载失败

时间:2011-04-24 18:34:53

标签: php orm lazy-loading doctrine-orm

我有两个实体,用户和客户端,一个客户端可以有很多用户。

通常我想拥有一个用户实体并延迟加载客户端但由于某种原因,当我尝试访问其属性时,客户端代理不会加载自身。

如果我像这样\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。

1 个答案:

答案 0 :(得分:6)

您永远不应将Doctrine中映射的属性定义为public。相反,您应始终将它们定义为受保护或私有,然后使用getter和setter访问它们。通过这种方式,Doctrine可以定义一个代理类,它可以重新定义"那些getter和setter(从而允许延迟加载)。

如果您直接访问该属性(就像您在$user->client->name中所做的那样),则Doctrine无法拦截该调用。