1

经过大量调试后,我注意到 CakePHP (2.x) 模型使用中的一个非常奇怪的行为:

当我更改模型 ID 并在与同一模型有关系的完全不同的对象实例上使用 read() 时,它会覆盖旧的模型数据。

// set the user, by using the 'User' model
$this->User->id = 1;
$this->User->read();

print_r($this->User->data); // works correctly

$instance = new Notification(); // this has a relation to the 'User' model

print_r($instance->User->data); // == $this->User->data! why?!

$instance->User->id = 2;
$instance->User->read();

print_r($this->User->data); // == $instance->User->data!

为什么这些模型相互连接?既然是新实例,它们不应该完全分开吗?我的意思是,我正在为通知设置“用户”模型,而不是为 $this

如果这是默认行为 - 我如何在不更改其他模型的情况下将数据读取()到不同的实例中?我真的需要手动创建一个新的“用户”实例并将其存储在某处$instance以避免这种行为吗?这对我来说听起来很丑陋。

4

1 回答 1

3

模型实例是单例

问题中的以下两个对象是相同的:

$this->User
$instance->User

因为它们实际上是同一个对象,所以用于访问对象的路径不会修改(用户)对象本身的行为。

这就是ClassRegistry::init的工作原理——它存储对模型实例的引用——并且当再次查询相同的别名 (className) 时将返回相同的对象。

不要使用 new 创建模型

这样做是不正常的——将来可能会导致问题或至少是混乱。要获取对 Notification 模型的引用,请使用$usesloadModelClassRegistry::init视情况而定。

不要使用 Model::read

我真的需要手动创建一个新的“用户”实例吗

绝对不是,这不是模型与 CakePHP 一起工作的方式。模型类实际上是数据库的接口,它不是单行的表示(调用保存时除外)。

避免大量问题的最简单方法是根本不使用Model::read,而是使用任何适当的 find 调用;更完整的代码示例将允许更具体的答案。

于 2013-07-12T08:01:48.610 回答