CakePHPの複合キーの議論
CakePHPを使う上で、複合キー、つまり、1つのテーブルに2つ以上のキーを持たせることができません。
システム全体をCakePHPで設計するのならば、正直、複合キーは使わないほうがシンプルに設計が可能だと思います。シンプルisベストといわれますが、必ずしもベストかどうかは良くわかりませんが…。
Cakeや、元となったRailsのコミュニティーでは長年議論されてきていますが、どうやら、CakePHP3.xでは複合キーを実装することになるらしいです。
業務上、どうしても既存のDBを呼び出して使わなければならない場合は非常に困ってしまいます。
どうしたらいいでしょうか?
1.コントローラーで何とかする
実は、primaryKeyは動的に変更可能です。
$this->モデル名->primaryKey = 'hoge_id';
そのうえで、$this->モデル名->bindModel();でアソシエーション設定を追加します。
使い終わったら元に戻すのを忘れずに!
2.キーごとにモデルを複数作る
テーブル名やプライマリキーは個別に設定できます。
なので、プライマリキーを変えた複数のモデルを作成すれば、いつものやり方でアソシエーション設定が可能です。
3.Viewテーブルを使う
ビューは作成済みのテーブルの中のカラムやデータ取得の条件を指定して作成した仮想的なテーブルのことです。
ビューテーブルに対し、モデルファイルを定義すればいつもと同じように使えますね。
実質的に2とほぼ同じ内容です。
4.モデル内で何とかする
beforeFind()でFind後の処理を定義できますので、ここでデータを追加してしまうという方法です。
独自に、通常のbelogsToやHasManyとは別のアソシエーションを定義を追加して、’primaryKey’というようなパラメータを追加して、その情報をもとにデータを追加すればよいかと思います。
汎用的にmodel.phpに記述することもできそうです。
ただし、処理負荷はかなり重くなってしまうことは確実なので、不要なときは処理しないようなスイッチが必要かと思います。
で、結局どうしたらいいのか
1は簡単ではありますが、複数のアクションやコントローラーで使う場合は使い回しがしにくいので、出来ればモデル内で対応したいところです。
ちなみに、非CakePHPベースのDBは、外部のDBという場合がほとんどかと思いますが、DBをまたいだテーブル同士のアソシエーション設定は(私の知る限り)できません。ですが、3もしくは4の方法であれば可能です。