saveAll()插入新行而不是更新

时间:2012-01-31 15:09:12

标签: cakephp cakephp-1.3

我尝试使用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
        )

)

3 个答案:

答案 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']));