2012-01-31 3 views
3

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

Моя модель, являются следующие: Магазин hasOne Карта

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 продолжает вставлять новую строку в таблице карт.

Я ничего не теряю здесь? Благодаря

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

Мой отладки ($ this-> данные) являются следующие

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

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

) 
+0

Показать отладку '$ this-> data' – Dunhamzzz

+0

@Dunhamzzz вопрос обновлен. Спасибо –

+0

@John - какова ваша форма-> создать? – Dave

ответ

3

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

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

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

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

2

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

// 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')); 
} 
+0

Идентификатор уже был установлен в его форме (как вы можете видеть в его массиве данных) – Dave

+0

Тем не менее, следует использовать метод Oldskool, учитывая, что данные формы могут быть изменены конечным пользователем – porjolovsky

1

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

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

Нет, вы не должны в этом случае. Он обновляет одну запись. Обновление всех препятствий для выполнения определенных операций cake (например, обновление измененного поля) –

Смежные вопросы