我有两个实体,用户和客户端,一个客户端可以有很多用户。
通常我想要一个用户实体并延迟加载客户端,但由于某些原因,当我尝试访问其属性时,客户端代理不会自行加载。
如果我像这样转储数据 \Doctrine\Common\Utils\Debug::log($user->client);
它将输出客户端代理及其客户端 ID。
如果我将获取策略更改为“EAGER”,我将获得完整的客户端实体,但在访问用户时我并不总是需要客户端实体,因此我宁愿尽可能使用 LAZY 加载。
编辑
当我稍后这样做时:
$user->client->name
即使我的代理获得了客户端 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;
编辑
我发现了为什么它不起作用,我所有的注释都扩展了一个基本注释,然后基本注释有一个 getter 和一个 setter 在代理类中使用时失败。
最佳答案
你永远不应该将在 Doctrine 中映射的属性定义为公共(public)的。相反,您应该始终将它们定义为 protected 或私有(private)的,然后使用 getter 和 setter 访问它们。这样,Doctrine 就可以定义一个“重新定义”那些 getter 和 setter 的代理类(从而允许延迟加载)。
如果你直接访问该属性(就像你在 $user->client->name
中所做的那样),Doctrine 没有办法拦截那个调用。
关于php - 学说 2 延迟加载失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5772416/