PHP初心者がFuelPHP1.8で多対多リレーションを触ってみる中編です。
前回のおさらい
前回はモデルに多対多のプロパティを書いて、1つのリレーション情報をセーブするところまでやりました。
[php]
$student = Model_Student::find(1);
$club = Model_Club::find(1);
$student->clubs[] = $club;
$student->save();
[/php]
こんな感じですね。モデルに書くだけで中間テーブルを直接操作しなくてもよくなるので楽ちんです。
データを参照したい場合は$student->clubs配列のインデックスにClubのidを指定します。
[php]
echo $student->clubs[1]->name;
[/php]
もちろん配列なのでforeach等で回してしまってもOK。
複数のリレーションを張る
配列で渡すだけです。例えば全てのclubに入っているようなスーパーstudentだと、
[php]
$student = Model_Student::find(1);
$clubs = Model_Club::find(‘all’);
$student->clubs = $clubs;
$student->save();
[/php]
ですね。
一個一個追加する場合も簡単です。
[php]
$student = Model_Student::find(1);
$student->clubs[] = Model_Club::find(1);
$student->clubs[] = Model_Club::find(2);
$student->clubs[] = Model_Club::find(3);
$student->save();
[/php]
注意点
紐づけされているデータがすでにある場合、$student->clubsにはそのデータが配列で格納されている事に注意してください。
例えば、
[php]
$student = Model_Student::find(1);
$student->clubs = array(Model_Club::find(1));
$student->save();
$student->clubs = array(Model_Club::find(2));
$student->save();
[/php]
この場合、$student->clubsプロパティが上書きされてしまうので、先にセーブしたModel_Club::find(1)への紐づけは消えてしまいます。
中間テーブルを確認してもらえば該当のデータが消えているのが確認できると思います。
紐づけを解除する
データの紐づけを解除したい場合はPHPのunset関数を使う方法があります。
[php]
$student = Model_Student::find(1);
unset($student->clubs[2]);
$student->save();
[/php]
$student->clubsのキーは関係データのidです。
これでID2のclub情報の関係だけを解除することができます。
全て解除するならば
[php]
unset($student->clubs);
$student->save();
[/php]
でOK。
お疲れ様でした。
次は、中間テーブルに何かしらの値を格納する場合です。
参考にしたサイト
- FuelPHP 日本語Document
- peketaminの日記:fuelphp メモ (多対多リレーションでのデータ保存と自作バリデーション)
- 眠るシーラカンスと水底のプログラマー:FuelPHPで多対多のリレーションを組む(many_many)
コメント