いきなり多対多のリレーションを作成しようとしてちょっと苦労しました。
多対多のリレーションを組むには、
以上の手順が必要です。
今回は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は自分の環境に合わせてください。
続いてモデル(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, ));
しばらくは作業1と2だけで自動的にリレーションしてくれると思い込んでいましたが、呼び出し時にリレーションを指定してあげる必要がありました。
Aをfindする際にBをリレーションさせるには以下のように記述します。
Model_A::find('all',array ( 'related' => array ( 'B', ), ) );
これで、関連するBが取得できました。
Please give us your valuable comment