CakePHP hasAndBelongsToMany(HABTM)で保存できた!

前に書いた
CakePHP hasAndBelongsToMany(HABTM)に超苦戦中!!!>< - やわらかたまご - molaovo -
の続編。

なんとか保存までできた。
CakePHPに苦戦して泣いている僕に救いの手を差し伸べてくれた@kanonjiさん、本当に感謝です!助かりました。

保存できない原因は?

なんと!HABTMで接続しているPKがchar(6)だったから。
どうやら、PKは数値型(Auto Increment)かcharならば36bytes(値はCakePHPが自動的にUUIDをセットする)でなければいけないようで。
CakePHPの規約 — CakePHP Cookbook v2.x documentation
それを読み飛ばしてフレームワークを使っていたのが悪かった。
困ったら、ちゃんとドキュメントを見よう。

経緯

Blog記事を書く

Twitterで見つけてもらう

サンプルと動作結果を教えてもらう



動作結果とサンプルとを見ながら自分のプロジェクトと見比べて、カラム名変えたりしていろいろ試すがうまくいかない

あれ?そういえばidとか数字だよなぁ・・・となんとなく思って検索してみる

「HABTMアソシエーションはchar(2)なんてサポートしてねーよ」って答えてる人を見つける。


TagテーブルのPKをid int auto incrementにする

CakePHPのDB設計に関する注意

そんなわけで、今回のことを踏まえて注意点をメモっておくと。

テーブルには必ず1カラムのPKを数値型かchar(36)かで付ける

数値型の場合はauto incrementにしておく。たとえばそれが紐付けテーブルで、IDなんていらないとしても・・・だ。

CakePHP モデルの相互に作用する全てのテーブル(join テーブルは除く)は、それぞれの列を一意に識別する単一フィールドのプライマリーキーが必要です。 単一のプライマリーキーを持たないテーブルをモデリングする場合、テーブルに単一フィールドのプライマリーキーを追加することが CakePHP の規約です。 このようなテーブルのモデルを使いたい場合は、単一フィールドのプライマリーキーを追加する必要があります。

テーブル・カラムの命名規則をCakePHPに合わせる

別に合わせなくてもなんとかなるところはあるものの、合わせておくとコードを書かなくて済む。

  • テーブル名は複数形
    • 単語区切りは_で。最後の単語が複数形になる感じで。
  • Modelは単数形
    • 単語区切りはキャメル記法で。
  • 接続用のテーブル名はアルファベット順の複数形_複数形
  • 接続用のカラム名は接続するテーブル名の単数形_id

参考:CakePHPの規約 — CakePHP Cookbook v2.x documentation

複雑にしない

CakePHPに限った話ではないけれど、できる限りシンプルにする。

でもさー・・・

今回、僕が手を出しているプロジェクトは設計から新規だから、テーブルの作り直しは問題ないのだけれど、
例えば、既存のシステムをCakePHPに置き換える場合に、これはけっこう大変なんじゃないかと。
まあ、ほとんどのところでSQLを書いてしまえば問題ないけれども、ならばCakePHP使わなくてもいいんじゃないか?とも思えてしまう。