多趣味ブログ

いろいろな事を広く浅く楽しむブログ

[FuelPHP]ORMの多対多リレーションメモ(中編)

      2016/12/16

imgres

PHP初心者がFuelPHP1.8で多対多リレーションを触ってみる中編です。

[FuelPHP]ORMの多対多リレーションメモ(前編)

前回のおさらい

前回はモデルに多対多のプロパティを書いて、1つのリレーション情報をセーブするところまでやりました。

$student = Model_Student::find(1);
$club = Model_Club::find(1);
$student->clubs[] = $club;
$student->save();

こんな感じですね。モデルに書くだけで中間テーブルを直接操作しなくてもよくなるので楽ちんです。
データを参照したい場合は$student->clubs配列のインデックスにClubのidを指定します。

echo $student->clubs[1]->name;

もちろん配列なのでforeach等で回してしまってもOK。

複数のリレーションを張る

配列で渡すだけです。例えば全てのclubに入っているようなスーパーstudentだと、

$student = Model_Student::find(1);
$clubs = Model_Club::find('all');
$student->clubs = $clubs;
$student->save();

ですね。

一個一個追加する場合も簡単です。

$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(); 

注意点

紐づけされているデータがすでにある場合、$student->clubsにはそのデータが配列で格納されている事に注意してください。
例えば、

$student = Model_Student::find(1);
$student->clubs = array(Model_Club::find(1));
$student->save(); 
$student->clubs = array(Model_Club::find(2));
$student->save(); 

この場合、$student->clubsプロパティが上書きされてしまうので、先にセーブしたModel_Club::find(1)への紐づけは消えてしまいます。
中間テーブルを確認してもらえば該当のデータが消えているのが確認できると思います。

紐づけを解除する

データの紐づけを解除したい場合はPHPのunset関数を使う方法があります。

$student = Model_Student::find(1);
unset($student->clubs[2]);
$student->save();

$student->clubsのキーは関係データのidです。
これでID2のclub情報の関係だけを解除することができます。
全て解除するならば

unset($student->clubs);
$student->save();

でOK。

お疲れ様でした。

次は、中間テーブルに何かしらの値を格納する場合です。

参考にしたサイト

 - FuelPHP, PHP