FuelPHPで多対多のリレーションを組む(many_many)

金曜日 , 30, 8月 2013 Leave a comment

 いきなり多対多のリレーションを作成しようとしてちょっと苦労しました。

 多対多のリレーションを組むには、

 

  1. 中間テーブルを用意してあげる
  2. モデルに多対多の設定をしてあげる
  3. 呼び出し時にリレーションを指定する

 

 以上の手順が必要です。

 

1.中間テーブルを用意する

 

 今回はAとBという2つのテーブルがあると過程します。

 この場合中間テーブルは以下。

 

CREATE TABLE IF NOT EXISTS `A_B` (
  `A_id` int(11) NOT NULL,
  `B_id` int(11) NOT NULL,
  PRIMARY KEY (`A_id`,`B_id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 ENGINEやCHARSETは自分の環境に合わせてください。

 

2.モデルに多対多の設定をしてあげる

 

 続いてモデル(AはModel_Aというクラス名、BはModel_Bというクラス名を想定)に以下を追記します。

 

     protected static $_many_many = array('A' => array(
        'key_from' => 'id', // Aのキー
        'key_through_form' => 'A_id', // リレーションテーブルの対応するAのキー名
        'table_through' => 'A_B', // リレーションテーブル名
        'key_through_to' => 'B_id', // リレーションテーブルの対応するBのキー名
        'model_to' => 'Model_B', // Bのクラス名
        'key_to' => 'id', // Bのキー
        'cascade_save' => true,
        'cascade_delete' => true,
    ));

 

3.呼び出し時にリレーションを指定する

 

 しばらくは作業1と2だけで自動的にリレーションしてくれると思い込んでいましたが、呼び出し時にリレーションを指定してあげる必要がありました。

 Aをfindする際にBをリレーションさせるには以下のように記述します。

 

Model_A::find('all',array
                           (
                               'related' => array
                               (
                                   'B',
                               ),
                           )
                       );

 

 これで、関連するBが取得できました。

 


Please give us your valuable comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください