NTTドコモ様_dカーシェア
NTTドコモ様_dカーシェア
2011.01.07

CakePHPは複合主キーに対応していないようです

まっちー

新年明けましておめでとうございます。本年も株式会社アストロデオをどうぞよろしくお願いいたします。

と、ちょっと遅れ気味の新年のごあいさつはともかくとして……。

タイトルの通り、今日は複合主キーのことでちょっと引っかかったことをお話しさせてください。実際この問題に引っかかったのって、もう1ヶ月以上も前の話なんですけど、とりあえず他に書くことが思いつかないんで、せっかくだから書き記しときます。

こっから先、もしも『今』って単語が出てきたら、実際には1ヶ月以上前のことだと思ってください。

複合主キーって今まで使ったことがないので、いまいち感覚がつかめていないんですが、今、仕事で他社さんが作ったシステムに新たにうちが作ったシステムを盛り込むみたいなことをやってまして、僕はいつもどおりCakePHPで開発をしていたんですが、他社さんの作ったテーブルのいくつかは、主キーが複合キーになってました。

対して気にはしていなかったんですけど、いざそのテーブルにうちのシステムからアクセス、要するにインサートなりアップデートなりする場面に来まして……で、そのときに思ったんですわ。

これ、どうやってアップデートするん?

CakePHPにはsaveFieldっていうモデルのメソッドがあって、これを使うと必要なレコードの必要なカラムだけ上書きできたりするんですが、どのレコードを上書きするかにあたって、プライマリーキーをセットしてあげないといけない。そしてたいていの場合、CakePHPは主キーは一つ、メジャーなのはidですかね、そんな感じになっちょります。

ネットでいろいろと調べ回ってみた限り、いくつかのサイトで書いてあったのは、『CakePHPは複合主キーに対応していない』というものでした。本家ですら、そう言ってた(↓)

http://book.cakephp.org/ja/compare/24/Model-and-Database-Conventions

ただまあ、印象としては、上手く使えば複合主キーって結構便利な存在なんじゃないかと思いました。

でもCakePHPで開発している以上は、対応していない問題には現状どうしようもない。

CakePHPのメソッドを使わずに、自分でSQL文を直接書いて投げるしかないんですかね、やっぱり…。