我尝试使用CakePHP SaveAll()方法更新记录,但是,它会添加新行而不是更新它。
我的模型如下:商店有一张地图
class Store extends AppModel {
var $name = 'Store';
var $hasOne = array(
'Map' => array(
'className' => 'Map',
'foreignKey' => 'store_id',
'dependent' => true,
'exclusive' => true
)
);
}
我的编辑表单有一个商店ID(隐藏字段),告诉CakePHP只更新特定记录。
<?php echo $this->Form->input('Store.id'); ?>
<?php echo $this->Form->input('Store.name', array('label' => 'Store name', 'required')); ?>
<?php echo $this->Form->input('Map.latlng', array('label' => 'Map location', 'required')); ?>
商店控制器中的我的编辑方法如下。
if ($this->Store->saveAll($this->data)) {
$this->Session->setFlash('Store has been updated.');
$this->redirect(array('controller' => 'store', 'action' => 'admin_index'));
}
每当我编辑商店时,商店名称都会更新,但CakePHP会继续在地图表上插入新行。
我在这里遗漏了什么?感谢
其他信息
我的调试($ this-&gt;数据)如下
Array
(
[Store] => Array
(
[id] => 52
[name] => Sena The Accessorizer
)
[Map] => Array
(
[latlng] => 3.1580681, 101.7126311
)
)
答案 0 :(得分:3)
正如@Dunhamzzz指出的那样,Map没有ID,因此CakePHP会插入一条新记录。
为了解决这个问题,我为Map.id
<?php echo $this->Form->input('Map.id'); ?>
这将告诉CakePHP更新该特定记录而不是插入新记录。
答案 1 :(得分:2)
如果您想更新数据而不是保存,则应始终在保存之前设置要更新的ID,如下所示:
// Set the store ID
$this->Store->id = $this->data['Store']['id'];
// Then save using that id
if ($this->Store->saveAll($this->data)) {
$this->Session->setFlash('Store has been updated.');
$this->redirect(array('controller' => 'store', 'action' => 'admin_index'));
}
答案 2 :(得分:1)
更新你应该使用:
$this->Store->updateAll($this->data, array('Store.id' => $this->data['Store']['id']));