gpt4 book ai didi

php - 学说 2 延迟加载失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:33:47 30 4
gpt4 key购买 nike

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

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

如果我像这样转储数据 \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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com