PowerCMS X Q&A

PowerCMS Xを用いてWebサイトを構築する際の技術的なヒントや解決策をご紹介します。

PADOでオブジェクトをロードする際に他のモデルを結合(参照)できますか?

PADOにおいてもJOIN句の利用は可能です。loadメソッドの第2引数でjoinを用いて以下のように記述します。

$terms = ['rev_type' => 0, 'workspace_id' => 1];
$args = [
    'join' => [
        'meta',                            // 結合するモデル
        ['id', 'object_id', 'LEFT JOIN'], // 結合元テーブルのカラム名, 結合先テーブルのカラム名, 結合方式
        ['model' => 'asset'],              // 結合するモデルの抽出条件(必要な場合のみ指定。この場合は`mt_meta`.`meta_model` = 'asset'という条件が追加されることになる)
        'id,object_id,text',               // 結合先テーブルから取得するカラム(必要な場合のみ指定)
    ],
];
$assets = $app->db->model('asset')->load($terms, $args, 'id,file_name');

上記コードで発行されるクエリは以下の通りです。

SELECT mt_asset.asset_id, mt_asset.asset_file_name, mt_meta.meta_id, mt_meta.meta_object_id, mt_meta.meta_text
  FROM mt_asset
  JOIN mt_meta ON mt_asset.asset_id = mt_meta.meta_object_id
  WHERE meta_model = ? AND ( asset_rev_type = ?  AND  asset_workspace_id = ? )

カラム値を取得する場合は通常$obj->カラム名と記述しますが、結合したモデルのカラム値を取得する場合は$obj->モデル名_カラム名となります。(本記事の例では$obj->meta_text

なお、結合したモデルのカラムに値をセットして更新することはできません。(本記事の例では$obj->meta_textの値を更新して$obj->save()してもmt_meta.textは更新されないということです。)結合を逆にしてください。

関連するQ&A