php - 学说 2 延迟加载失败

标签 php orm lazy-loading doctrine-orm

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

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

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

相关文章:

php - 如何使用 php 中准备好的语句插入数据库

Angular 父子模块 block 大小问题

lazy-loading - Elm 中的动态/惰性导入

php - 使用 PHP mail() 函数通过 Exchange 发送电子邮件时出现延迟(使用 sendmail 作为中继)

php - Symfony 2 + Doctrine : How to supress SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry

sql - ORM 性能成本

java - 如何修复 hibernate hbm.xml 文件以使复合主键正常工作? (映射异常)

angularjs - 更改 View 时加载 Controller 的最简单方法是什么?

php - Laravel Eloquent 模型 id 作为字符串返回错误值

database - 我如何在 Redis 中组织汽车的制造商、型号和生成