よくあるご質問

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 は更新されないということです。)結合を逆にしてください。

更新日:2025年01月15日

カテゴリー

FAQ キーワード検索

解決しなかった場合は
下記よりお問い合わせください

お問い合わせ

日本語
ふりがな付き
English
简体中文
繁體中文
한국어