2016-09-18 6 views
2

私はプロジェクト&のコメントテーブルの間にhasManyアソシエーションを作成しました。ケーキPHP - HasMany関連を保存する

このurl:/ projects/addから、ユーザーは新しいプロジェクトを作成していくつかのコメントを書くことができます。

要求は、このような配列を返す:バリコメントで

[ 
    'name' => 'Project name', 
    'comments' => [ 
     (int) 0 => [ 
      'text' => 'This is a comment on this project' 
     ], 
     (int) 1 => [ 
      'text' => 'Comment' 
     ] 
    ] 
] 

を、私ははminLength 30ルールを追加しました。

上記の例では、バリデータは2番目のコメントでエラーを返し、録画をブロックします。

私がしたいのは、プロジェクトと良いコメントを保存し、 "プロジェクトは保存されましたが、1つ以上のコメントが保存されませんでした"というエラーを返します。

ありがとうございました!

答えて

0

This answerは、探していることを行う方法の1つを示しています。関連付けられたモデルで検証エラーが発生した場合は、保存して、hasMany関係をアンバインドしてください。

セーブコールを分割するほうがはるかにクリーンだと思います。

if (!$this->Project->save($this->request->data['Project'])) { 
    throw new Exception($this->Project->getErrors()); 
} 

if (!$this->Project->Comment->save($this->request->data['Comment'])) { 
    $message = 'The project has been saved, But one or more comment was not saved'; 
} 
+0

こんにちは、私は、他のトピックの答えの論理を理解していますが、私はあなたのことを理解していません。あなたの答えを説明できますか? –

+1

ええ、ええ。もう1つの答えは、1つの呼び出しですべての関連データを保存しようとするモデルの関連付けを利用しています。問題は、関連付けられた検証が失敗し、関連するデータのバインドを解除し、別の保存を試行すると、面倒なelse文が発生することです。セーブコールを分離することは、モデルの関連付けを利用するのではなく、ロジックを大幅に簡素化します。各呼び出しでテーブル固有のデータを保存しようとするだけです。つまり、 'comments'検証が失敗してもデータは' projects'テーブルに保存されます。 – bill

+0

この説明のためにタンクしてください。しかし、この方法では、プロジェクトフォーム内でコメントのモデルを使用できますか? –

関連する問題