読者です 読者をやめる 読者になる 読者になる

【fuelphp】ORMでの基本的なリレーションの使い方メモ

fuelphp

はじめに

今さらだけどfuelphpのorm少し使ってみた。
ormずっとあまり使ってこなかったのだけど、最近少しいいかもって思い始めてきた。

ただ、どこまで使うかって決めの部分は大事かも。
自分の場合はあくまで単純でありきたりクエリを実行したい場合はいいかもって思った。

複雑なクエリでどんなSQLが実行されるかもパッと頭に思い浮かばないようなのはSQL直書きの方がいいと思う。
あくまで個人的な考えだけど・・・

データの取得

今回考えたテーブル構成は以下

large_categories


idPK
name

categories



idPK
large_category_idFK(large_categories.id)
name

products



idPK
category_idFK(categories.id)
name

モデルを作る

model/largegroup.php

<?php
class Model_Largegroup extends \Orm\Model
{
    // テーブル名を明示的に指定
    // テーブル名にアンダースコアがあるためFulePHPの命名規則にのったクラス名が使えない
    protected static $_table_name = "large_groups";

    protected static $_has_one = [
	"groups" => [
            "key_to" => "large_group_id",
        ]
    ];
}

model/group.php

class Model_Group extends \Orm\Model
{
    // 接続元カラム名を明示的に指定
    // テーブル名にアンダースコアがあるためFulePHPの命名規則にのったクラス名が使えない
    protected static $_belongs_to = [
        "largegroup" => [
            "key_from" => "large_group_id",
        ]
    ];

    protected static $_has_many = ["products"];
}

model/product.php

<?php
class Model_Member extends \Orm\Model
{
    protected static $_belongs_to = ["group"];
}
モデルを使う
Controller_Products extends Controller
{
    public function action_index()
    {
        /**
         * ・・・ from products
         * left join groups products.group_id = groups.id
         * left join large_groups groups.large_group_id = large_groups.id
	 */
        $products = Model_Member::find("all", [
            "related" => ["group" => [
                "related" => ["largegroup"]
            ]],
        ]);

        /**
         * ・・・ from products
         * inner join groups products.group_id = groups.id
         * inner join large_groups groups.large_group_id = large_groups.id
         */
        $products = Model_Member::find("all", [
            "related" => ["group" => [
                "join_type" => "inner",
                "related" => ["largegroup" => [                                                                                                                                                                    
                    "join_type" => "inner",                                                                                                                                                                        
                ]]
            ]],
        ]);

        // モデルへの参照方法
	foreach ($products as $product) {
            // => $product["id"]
            // => $product->groups["id"]
            foreach ($product->groups->members as $member) {
                // => $member["id"]
            }
        }
    }
}

これだけのコード量でJOINとか簡単にできるのはいいかも。
バリデーションとかフォームの自動生成とかそこまでは使いこなしたくないな。。。今のところは

あと、これ以上複雑になりそうならSQL直書きかな。。。今のところは
以上です