CakePHP模型实例混淆
在调试了一段时间后,我注意到CakePHP(2.x)模型使用中有一个非常奇怪的行为: 当我更改模型ID并在与同一模型有关系的完全不同的对象实例上使用read()时,它会覆盖旧模型数据CakePHP模型实例混淆,php,cakephp,model,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 $insta
// 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
中的某个位置以避免这种行为吗?这听起来很难看。模型实例是单例的
问题中的以下两个对象是相同的:
$this->User
$instance->User
因为它们实际上是同一个对象,所以用于访问对象的路径不会修改(用户)对象本身的行为
这就是它的工作原理,当再次查询相同的别名(类名)时,它将返回相同的对象
不要使用“新建”创建模型
这样做是不正常的,而且可能会在将来引起问题或至少是混乱。要获取通知模型的引用,请根据需要使用或ClassRegistry::init
不要使用Model::read
我真的需要手动创建一个新的“用户”实例吗
绝对不是,这不是模型使用CakePHP的目的。模型类实际上是数据库的接口,它不是一行的表示(调用save时除外)
避免大量问题的最简单方法是根本不使用,而是使用;一个更完整的代码示例可以提供更具体的答案。谢谢,这确实为我澄清了一些问题。我现在不明白的是,为什么在cakePHP文档中,所有内容都使用单个模型行显示。我的意思是:如果您创建一个新的“行”——您在模型上使用
->create()
——并且在许多情况下,您也在模型上设置->id
(至少在某些示例中是这样)。如果模型应该表示整个表而不是一行,那么这似乎是一个相当混乱的用法。所以我一直在猜测,$this->User是一个新的用户实例,而不是一个单例,因为$this->User->id是允许的。当调用save是一个特定的用例时,该调用的模型表示一个单独的行,但一般来说,该模型是一个返回数组的类,即数组(行,行2,行3)-“行表示”数据类型只是一个数组,而不是模型对象。