FuelPHP1.7でOrmモデルのリレーション($_has_many)

ORM(オブジェクトリレーショナルマッパー)はリレーションを組むのに便利なモデル。
FuelPHP1.7でのOrmのメソッド操作も参照。

FuelPHPでは $_has_many、$_belongs_to、$_has_one、$_many_manyという4つの種類のリレーションが用意されている。

今回は、「$_has_many」だけ。
「$_has_many」は1対多のリレーションを設定する。

公式サイトの説明、よくわからんな・・・

1.$_has_manyでリレーション設定

Model_Post と Model_Comment の2つのモデルで考える。

Model_Post と Model_Comment を「1対多」となるよう設定する。
1つの記事に複数のコメントがつくイメージ。

その場合、「Model_Post」に「$_has_many」を、「Model_Comment」に「$_belong_to」を記述する。
「Model_Comment」をターゲットモデルと便宜上呼ぶ。

「Model_Post」に $_has_manyを定義する。

基本的な設定がこれ、らしいが、これだけで使用することはなさそう。

[PHP]
protected static $_has_many = array(‘comments’);
[/PHP]

通常はこっち。
このリレーションを「comments」と名づける。操作するときに使う。

protected static $_has_many = array(
    'comments' = array(
        'key_from' = 'id' //①
        'model_to' = 'Model_Comment', //②
        'key_to' = 'post_id', //③]
        'cascade_save' = true, //④
        'cascade_delete' = false, //⑤
    )
);

① key_from:結合条件の自分側(記述しているモデル側)。

② model_to:ターゲットモデルを指定。つまり「多」の方のテーブルがマッピングされたモデル名(Model_Comment)。

③ key_to:結合条件の相手側(ターゲットモデル側)。

④ cascade_save:カスケードされたターゲットモデルも更新するかどうか。

⑤ cascade_delete:カスケードされたターゲットモデルも削除するかどうか。

「Model_Comment」のほうに $_belong_toを指定する

「$_belongs_to」は「自分が紐付けられる側ですよ~」の意味。
$_has_manyで「model_to」に指定したモデル内に記述する。

リレーション名を「post」と名づける。

// postに属しているModel_Commentで
protected static $_belongs_to = array(
    'post' => array(
        'key_from' => 'post_id', //①
        'model_to' => 'Model_Post', //②
        'key_to' => 'id', //③
        'cascade_save' => true,
        'cascade_delete' => false,
    )
);

① fromは「~から」って意味だから自分のとこ(この場合はModel_Commentのカラム)

② toは「~へ」って意味だから相手

③ 同上

2.リレーションの使い方

デフォルトでリレーションは使えないため、リレーションの確立という操作を最初に行なう。
①の comments はModel_Postで定義したやつ。

// 両方のメインと関連オブジェクトをnewする:
$post = new Model_Post();
$post->comments[] = new Model_Comment(); //①
$post->save();

それから操作。
① ID=1 の記事をとってくる。
② ID=6 のコメントをModel_Commentから取得する。

$post = Model_Post::find(1); //①
$post->comments[6] = Model_Comment::find(6); //②
$post->save();

最後にリレーションの切断を行なう。
これで全部切れるの?

$post = Model_Post::find(1);
unset($post->comments[6]);
$post->save();

使い方色々あって、全部は紹介しきれない。全部理解できてない。
Orm奥深すぎ。

参考

はじめに – Relations – Orm Package – FuelPHP ドキュメント

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

FuelPHP1.6、ORMモデル間の関連付け(has_one、has_many、belongs_to)を理解する。|マコトのおもちゃ箱 ~ぼへぼへ自営業者の技術メモ~

[FuelPHP] ORMモデルによるリレーション | RuputerFan

コメント

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