■環境
CakePHP 1.3.x
■やりたいこと
モデル内で異なるDB間(複数のDB)をリレーションし、
それぞれのDBのカラムを出力する関数を定義する。
■結論
普通の仕組みではムリ。ハックすればできる(らしい)。
■現状の整理
異なるDB間のリレーション自体ができないわけではない。
異なるDB間のモデルの紐付け(hasManyとか) → ○ 異なるDB間のモデル紐付け後にmodelsに関数作成 → ×(unknown columnと言われる) 異なるDB間のモデル紐付け後にcontrollersに関数作成 → ○(model以外なら実行可)
■自分が取った対策
modelsで関数定義はあきらめて、component化した。
(ファットモデルはあらきめた)
【app/config/database.phpの設定】
こんな感じで設定 → CakePHP で複数のデータベースを使用する - mallowlabsの備忘録
【app/models/読み込むモデルの設定】
同上
【app/controllers/components/読み込むコンポーネントの設定】
ここを参考に異なるDBのカラムを出力する関数を作成
第12回 コンポーネントの作り方:CakePHPで高速Webアプリ開発|gihyo.jp … 技術評論社
【app/controllers/コントローラの設定】
冒頭でこんな感じで呼び出し
var $useDbConfig = 'userdb'; var $uses = array('DB1のモデル', 'DB2のモデル'; var $components = array('DB1とDB2両方を参照する関数を書いたコンポーネント');
そのあと、コンポーネントを呼び出す。
■参考資料
本件についての議論など(ハックすればできるよ的な内容含む)。
※日本語での内容は見当たらず
CakePHP - querying across models with multiple databases and useDbConfig
cakephp - Association and model data saving problem - Stack Overflow
Multiple Databases Model Relationship - CakePHP | Google Groups
■補足
自分がCakePHPの仕組みをあまり分かっていない可能性もあり、
そもそも、そういう動きをさせない(こういう疑問が出ないのが普通?)のが
普通かもしれません。