CakePHP模型实例混乱

时间:2013-07-12 07:13:05

标签: php cakephp model

经过相当多的调试后,我注意到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中以避免此行为?这对我来说听起来很难看。

1 个答案:

答案 0 :(得分:3)

模型实例是单例

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

$this->User
$instance->User

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

这就是ClassRegistry::init的工作原理 - stores a reference to model instances - 并且在再次查询相同的别名(className)时将返回相同的对象。

不要使用新的

创建模型

这样做并不正常 - 并且可能会在将来引起问题或至少造成混淆。要获取对通知模型的引用,请根据需要使用$usesloadModelClassRegistry::init

不要使用Model :: read

  

我是否真的需要手动创建新的“用户”实例

绝对不是,这不是模型用于CakePHP的方式。模型类实际上是数据库的接口,它不是单行的表示(调用save时除外)。

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