2011-02-16 20 views
1

私はUserモデルを持っています。CakePHPセーブモデルと関連モデル

それはこのようになりますフォームを含むビューを登録しています

echo $this->Form->create('User',array(NULL,NULL,'class' => 'signinform')); 
echo $this->Form->input('first_name'); 
... 
echo $this->Form->end('Create Account'); 

フォームを送信すると、それは次のように保存します。

$this->User->save($this->data) 

これは動作します。私はこのようなフィールドを追加

var $hasMany = 'Address'; 


は、私は私のユーザーモデルに入れusers.id

への外部キーがあるフィールドuser_idaddressesと呼ばれる私のデータベースにテーブルを追加しました登録フォームに:

echo $this->Form->input('Address.city'); 

私はこれがアドレステーブルに新しいエントリを作成し、それを新しいユーザに関連付けることを期待しました。それは新しいユーザーを作成しますが、アドレステーブルには何も配置しません。

私はsaveAllsaveから保存機能を変更してみました:

$this->User->saveAll($this->data) 

今、何も保存されませんされます。

私は間違っていますか?

答えて

4

CakePHPのセービングは、関係の中でそれを保存するためにもう少し作業が必要です。ここにはan example from the documentationがあります。

<?php 
function add() { 
    if (!empty($this->data)) { 
     // We can save the User data: 
     // it should be in $this->data['User'] 

     $user = $this->User->save($this->data); 

     // If the user was saved, Now we add this information to the data 
     // and save the Profile. 

     if (!empty($user)) { 
      // The ID of the newly created user has been set 
      // as $this->User->id. 
      $this->data['Profile']['user_id'] = $this->User->id; 

      // Because our User hasOne Profile, we can access 
      // the Profile model through the User model: 
      $this->User->Profile->save($this->data); 
     } 
    } 
} 
?> 

あなたが複数のデータベースの変更を行う

、あなたは彼らが成功するか失敗一緒に作るために using transactionsを検討すべきです。トランザクションを使用したくない場合は、リクエストが途中で失敗したときにユーザーに表示する内容を検討してください。また、データベースの状態と回復方法についても検討してください。

+0

これは動作しますが、質問を頼む:ユーザーを保存すると成功しますが、アドレス/プロファイルの保存に失敗した場合 - 何をすべきか?フォームに戻すと、新しいユーザーを再度作成しようとします。 –

+0

これが起こった場合、@ John、私はそれらを作成したユーザーを編集するための画面にリダイレクトし、エラーメッセージをフラッシュメッセージとして表示します。あるいは、両方の挿入が成功するか失敗するようにトランザクションを使用することができます:http://book.cakephp.org/view/1633/Transactions –

+0

ありがとう! –

1

ます。また、アドレスモデルでこれを配置する必要があるかもしれません:

var $belongsTo = 'User';

関連する問題