2012-01-31 21 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を指示する店舗ID(隠されたフィールドを)持っています。

<?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

@ジョン - あなたのフォームは何ですか?>作成しますか? – Dave

答えて

3

@Dunhamzzzが指摘しているように、MapにはIDがないため、CakePHPは新しいレコードを挿入します。

は、この問題を解決するには、私の代わりに新しいものを挿入すること、特定のレコードを更新するためにCakePHPを教えてくれますMap.id

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

このために隠しフィールドを作成しました。

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

IDはすでにフォームに設定されています(データ配列に表示されています) – Dave

+0

フォームデータをエンドユーザが変更できる場合は、Oldskoolのメソッドを使用する必要があります – porjolovsky

1

このように、保存前に更新したいです210
$this->Store->updateAll($this->data, array('Store.id' => $this->data['Store']['id'])); 
+1

いいえ、この場合は使用しないでください。彼は1つのレコードを更新しています。すべてを更新すると、特定のケーキ操作が発生するのを防ぎます(変更されたフィールドの更新など) –

関連する問題