cakePHP(v2)で主キーをid以外にする方法 
2012/09/23, 03:53 - IT
cakePHPの規約では、テーブルの主キーは ”id” という名前で固定になっているので、
これに沿わない規約でテーブル構築されている場合に scaffoldしたり、bakeでソースを生成するとうまく動かない。
※version 1.x 系では、各Modelに設定を入れると動くようだが、v2.2ではダメだった。
 (設定が間違ってただけかもしれない・・というか、きっと間違っていた気がするが。)

そこで、微妙にソースを弄ってみると、うまくいった。

例えば
 ・主キー名は ”テーブル名_id”
 ・テーブル名は複数形
という規約でテーブルが作られている場合

◆弄る箇所
 ソース:lib/Cake/Model/Model.php ※app配下のLibではありません
 メソッド:コンストラクタ(__construct)

[変更前]
--------------------------
if ($this->primaryKey === null) {
  $this->primaryKey = 'id';
}
--------------------------

[変更後]
--------------------------
$tableName = strtolower($this->alias);
if (substr($tableName,strlen($tableName)-3) == "ies") {
  $this->primaryKey = substr($tableName,0,strlen($tableName)-3)."y_id";
} else if (substr($tableName,strlen($tableName)-1) == "s") {
  $this->primaryKey = substr($tableName,0,strlen($tableName)-1)."_id";
} else {
  $this->primaryKey = substr($tableName,0)."_id";
}
--------------------------

だいたいこんな感じで弄ると、うまくいく。
これで、規約がバチッと固まっている場合は、個別にModelを弄らなくてもよいのでラクだ。
というか「俺たちはこの規約なんだ!」って場合ならCoC的な利点も活かせるので、こっちの方が良い気がする。(あくまでも私見)

ただし、他にどんな影響があるのかは不明。シーン。。



戻る