1.Ormのリレーションの設定
Ormの利点はリレーションを意識したモデル操作ができること。
前回作った testsテーブルで管理するユーザ情報に、電話番号を追加したい、という場面。
そんな時はphonesテーブルを作成して、idでひもづける。それをOrmで!
ということでphonesテーブルをつくるぞ。
oil g model phones test_id:int number:varchar[20] oil refine migrate
この phonesテーブルと testsテーブルを関連づけたい。
そのため、Model_Test に $_has_manyプロパティを設定する。
protected static $_has_many = array('phones');
testsテーブルで、id=1のユーザに999-9999-999という電話番号を登録する場合を考える。
適当なコントローラを作成してみる(APPPATH/classes/controller/test.php)。
<?php class Controller_Test extends Controller { public function action_index() { $user = Model_Test::find(1); //① $phone = Model_Phone::forge(); //② $phone->number = '999-9999-999'; //③ $user->phones[] = $phone; //④ $user->save(); //⑤ } }
①find()メソッドでid=1のユーザを取得し、$userオブジェクトに代入
②Model_Phoneオブジェクトを生成し、$phoneに代入
③$phoneオブジェクトの$numberプロパティに値を代入
④$phoneオブジェクトを$userオブジェクトの$phones配列に追加
⑤$userオブジェクトを保存
を行っている。
ユーザの電話番号にアクセスするには、Model_Testオブジェクトの $phonesプロパティを操作すればいい。
phones[0]はid、phones[1]はtest_id、phones[2]はnumberのこと。
$user = Model_User::find(1); $user->phones[2]->number = '111-1111-111'; //$phones配列の要素を操作 $user->save(); //$userオブジェクトの保存
2.リレーションの詳細設定
リレーションの簡単設定はこう。
prtected static $_has_many = array('phones');
これを詳細に設定すると以下のようになる。
protected static $_has_many = array('phones' =>array( 'model_to' => 'Model_Phone', //① 'key_from' => 'id', //② 'key_to' => 'user_id', //③ 'cascade_save' => true, //④ 'cascade_delete' => false, //⑤ ) );
①model_to:参照先のモデル名を指定
②key_from:メインのモデル内のカラム名を指定。リレーションを指定するため。
③key_to:key_fromに対応する参照先モデルのカラム名を指定
④cascade_save:メインモデル保存時に三種王先モデルも保存する場合はtrue、しない場合はfalse
⑤cascade_delete:メインモデルの削除時に参照先モデルも削除する場合はtrue、しない場合はfalse
リレーションタイプ
リレーションタイプは、$_has_manyを含めて4種類ある。
$_has_many:一対多のリレーション
$_belongs_to:多対一のリレーション
$_has_one:一対一のリレーション
$_many_many:多対多のリレーション
この$_many_manyの場合、中間に対応関係のみを表すテーブルを用意する必要がある。
ユーザ情報を保存するtestsテーブルとユーザグループを保存するgroupsテーブルがあり、ユーザが複数のグループに属する場合。
groupsテーブルは以下のコマンドで。
oil g model tests_groups test_id:int group_id:int oil refine migrate
この場合、リレーションの詳細設定はこのように。
protected static $_many_many = array( 'tests' => array( 'key_from' => 'id', 'key_througth_from' => 'test_id', //② 'table_through' => 'tests_groups', //① 'key_through_to' => 'group_id', //③ 'model_to' => 'Model_Group', 'key_to' => 'id', 'cascade_save' => true, 'cascade_delete' => false, ) );
①table_through:中間テーブル名
②key_through_from:中間テーブルでの、key_fromに対応するカラム名
③key_through_to:中間テーブルでのkey_toに対応するカラム名
を新たに追加する。
参考
FuelPHP入門
コメント
[…] ORM http://runble1.com/fuelphp-orm-relation/ […]