2012-03-06 5 views
0

次のように私のモデル関係がある参加:私は何をしたいかCakePHPの2.1 - 保存(および作成)複数のモデルとそれに関連するモデル

Student hasMany ClassStudent 
Class hasMany ClassStudent 
ClassStudent belongsTo Student 
ClassStudent belongsTo Class 
ClassStudent is a join model. 

は、学生(複数可)を作成し、既存のクラスを使用するか、作成しているが新しいものを作成し、生徒とクラスをリンクする結合モデルレコードを作成します。

私はこれをすべて1回の呼び出しで保存します(これが可能であれば)。私が試してみました

$data = array(
    'Student' => array(
     '0' => array(...), // Data in here 
     '1' => array(...), 
     ..., 
     'n' => array(...) 
    ), 
    'Class' => array(
     'class_id' => x // The class that I want the above students to be associated with 
    ) 
) 

を私は何をしたいのかは、ユーザーが新しいを追加したい場合は、おそらく同時にクラスを作成(学生のn個のレコードを作成してもクラスに追加されます1)。私はまた、学生レコードを作成する際に、各生徒のクラスへの結合モデルレコードを作成したいと思っています。

これは可能ですか?私はCake 2.1.0(今日の安定版)を使用していますが、$ options ['deep'] = trueでsaveAll(saveAssociatedとsaveMany)の異なるタイプを試しました。

データ配列の形式が正しくない可能性がありますか?

編集:私も試してみました

上記の場合
$data = array(
    'ClassStudent' => array(
     '0' => array(
      'Student' => array (...), // Data 
      'Class' => array(id => x) // The id of the Class the Student should be associated to 
     ..., 
     'n' => array(
      'Student' => array(...), // n-th Student 
      'Class' => array(id => x) 
    ) 
); 

$this->saveAll($data['ClassStudent'], array('deep' => true)); 

、それが成功した学生のテーブルに新しい学生レコードを作成しますが、何も結合テーブルに作成されません。

答えて

-1

saveAll(saveAllはsaveManyとsaveAssociatedのラッパー)は、ジョブの適切なツールです。 saveAllのドキュメントを見てください。2.1に関する変更についてのメモはありません。読んで時間をかけて、ここにいくつかの考えがあります

最初に、あなたのアレイ構造にタイプがありますか?クラスがすでに定義されている場合は、

'Class' => array ('class_id' => x) 

持って、あなただけの学生を追加するために欠けている、それはそうは言って

'ClassStudent' => array('class_id' => x) 

、CakesPHP ORMはあなたが使用できるようにする必要がありますでしょうsaveAllは数値インデックスを使用するhasManyを使用しているため、タイプミスがあると仮定すると、以下のように動作します。

$data = array(
    'Student' => array(
     '0' => array(...), // Data in here 
     '1' => array(...), 
     ..., 
     'n' => array(...) 
    ), 
    'ClassStudent' => array(
     'class_id' => x // The class that I want the above students to be associated with 
    ) 
) 
$this->ClassStudent->saveAll($data); 
+0

Hey Ryan、返信ありがとうございます。私は一度に1つの結合モデルを保存するためにリンクしたメソッドを使用しました。しかし、その場合、私は1つしかやっていませんでした。 複数の結合モデルを同時に作成することはできません。 – user1251202

+0

これは実際にはもっと面白いです。もう少し読んだら、Cakeのドキュメントが混乱を招いているようです。現時点では、クラスアソシエーションを保存することはできますか?ClassStudentモデルのsaveAllを呼び出してください。 –

+0

Hey Ryan、私は上記のデータ形式を試しましたが、動作していないようです。私の呼び出しは、問題があるかどうかは分かりませんが、ClassStudentモデルでは、$ this-> saveAll($ data、array( 'deep' => true)をコールする関数があります。深くない)。私のクラスコントローラでは、$ this-> Class-> ClassStudent-> saveClassStudents($ this-> request-> data)というメソッドを呼び出しています。 データベースをチェックすると、新しいレコードがないことに注意してください。 – user1251202

関連する問題