saveAll () вставляет новую строку вместо обновления - PullRequest
3 голосов
/ 31 января 2012

Я пытаюсь обновить запись с помощью метода CakePHP SaveAll (), но, тем не менее, он добавляет новую строку вместо обновления.

Моя модель выглядит следующим образом: Магазин имеет одну карту

class Store extends AppModel {  
    var $name = 'Store';

    var $hasOne = array(
        'Map' => array(  
            'className' => 'Map',
            'foreignKey' => 'store_id',
            'dependent' => true,
            'exclusive' => true
        )
    );
}

Моя форма редактирования имеет идентификатор хранилища (скрытое поле), чтобы 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 продолжает вставлять новую строку в таблицу Map.

Я что-то здесь упускаю?Спасибо

Дополнительная информация

Моя отладка ($ this-> data) выглядит следующим образом

Array
(
    [Store] => Array
        (
            [id] => 52
            [name] => Sena The Accessorizer
        )

    [Map] => Array
        (
            [latlng] => 3.1580681, 101.7126311
        )

)

Ответы [ 3 ]

3 голосов
/ 01 февраля 2012

Как указал @Dunhamzzz, у Map нет идентификатора, поэтому CakePHP вставляет новую запись.

Чтобы решить эту проблему, я создал скрытое поле для Map.id

<?php echo $this->Form->input('Map.id'); ?>

Это скажет CakePHP обновить эту конкретную запись вместо вставки новой.

2 голосов
/ 31 января 2012

Если вы хотите обновить данные, а не сохранить, вы всегда должны установить идентификатор, который хотите обновить до сохранения, например:

// 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'));
}
1 голос
/ 31 января 2012

для обновления вы должны использовать:

$this->Store->updateAll($this->data, array('Store.id' => $this->data['Store']['id']));
...