FuelPHP1.7のORMでモデル間のリレーションを設定

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入門

Many to Many – Relations – Orm Package – FuelPHP ドキュメント

コメント

タイトルとURLをコピーしました