Den*_*nis 5 php orm lazy-loading doctrine-orm
我有两个实体,用户和客户端,一个客户端可以有很多用户.
通常我想拥有一个用户实体并延迟加载客户端但由于某种原因,当我尝试访问其属性时,客户端代理不会加载自身.
如果我像这样转储数据\Doctrine\Common\Utils\Debug::log($user->client);,它将输出客户端代理及其客户端ID.
如果我将获取策略更改为"EAGER",我将使客户端实体保持原样,但是当我访问用户时,我并不总是需要客户端实体,因此我更倾向于使用LAZY加载.
编辑
当我稍后这样做:
$user->client->name
Run Code Online (Sandbox Code Playgroud)
即使我的代理获得了客户端ID,我也会返回null.
这是我的两个关系(在注释中):
// 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;
Run Code Online (Sandbox Code Playgroud)
编辑
我发现为什么它不起作用,我的所有注释都扩展了一个基本注释,然后基本注释有一个getter和一个在代理类中使用时失败的setter.
小智 6
您永远不应该将Doctrine中映射的属性定义为public.相反,您应始终将它们定义为受保护或私有,然后使用getter和setter访问它们.这样,Doctrine可以定义一个代理类,"重新定义"那些getter和setter(从而允许延迟加载).
如果您直接访问该属性(正如您所做的那样$user->client->name),Doctrine无法拦截该调用.
| 归档时间: |
|
| 查看次数: |
3361 次 |
| 最近记录: |