原则2:延迟加载失败



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

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

如果我像这样转储数据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没有办法拦截该调用

最新更新