我只是熟悉cakephp(感谢我之前的开发人员),并遇到了一些有趣的事情。我终于找到了什么问题,但仍然不知道为什么。在非常伪的代码中:
控制器函数在同一范围内调用bar()两次:
$value = 'A';
$this->foo->bar($value);
// do other stuff
$value = 'B';
$this->foo->bar($value);
bar()基本上只是调用cakephp的save()模型来将$ value写入表foobar $:
$AppModel->save(array(
'AppModel'=> array('value'=>$value)
));
我预计save()会在foobar $中创建两行,但事实并非如此。它首先创建一个值为A的行,然后将该行更新为值B.当第二个调用运行时,它识别出前一个调用生成的DB id,确定它是相同的条目并使其成为更新而不是插入。这有点意义,但它们仍然是单独的电话,对吧?我在这里错过了什么明显的东西?非常感谢。
答案 0 :(得分:5)
将某些内容保存到数据库后,Cake会将$Model->id
设置为最后一个插入ID。
保存时,如果数据数组中有id
字段,则应该保存,或者如果$Model->id
上设置了id,则Cake会更新此条目。这两个都更新了条目42:
$Model->save(array('id' => 42, 'value' => 'foo'));
$Model->id = 42;
$Model->save(array('value' => 'foo'));
要确保您创建新条目,请按照here所述,致电Model::create()
。
答案 1 :(得分:2)
我通常总是在保存之前进行模型创建调用。如果您保存的数组已经具有主键,则它将更新该行,否则它将执行插入:
插入:
$Model->create();
$Model->save(array('value'=>'foo'));
更新
$Model->create();
$Model->save(array('id'=>1,'value'=>bar'));