ポイント
- CakePHP の恩恵を受けるためにはテーブルのカラム名は小文字にしましょう!規約には明記されていないけど、きっと当たり前扱いなんでしょう♪
いったい何があったのか?
テーブルを作って、bake でちゃっちゃとデータを登録しようとしましたら、エラーとなってしまいました。。。アイエエエエエ!?ナンデ?
テーブルを作る SQL はこちらでした。これを実行した時点で、MySQL には次のように登録されました。
- テーブル名 小文字に変換された。
- カラム名 大文字のまま。
CREATE TABLE GROUPS ( ID INT NOT NULL AUTO_INCREMENT, NAME VARCHAR(100), CREATED DATETIME, MODIFIED DATETIME, PRIMARY KEY (ID) );
原因を調べる
エラーとなったビューを見てみましょう。すぐに原因を特定できました。
app/View/Groups/index.ctp
foreach ($groups as $group): ?> <tr> <td><?php echo h($group['Group']['ID']); ?> </td> <td><?php echo h($group['Group']['NAME']); ?> </td> <td><?php echo h($group['Group']['CREATED']); ?> </td> <td><?php echo h($group['Group']['MODIFIED']); ?> </td> <td class="actions"> <?php echo $this->Html->link(__('View'), array('action' => 'view', $group['Group']['id'])); ?> <?php echo $this->Html->link(__('Edit'), array('action' => 'edit', $group['Group']['id'])); ?> <?php echo $this->Form->postLink(__('Delete'), array('action' => 'delete', $group['Group']['id']), null, __('Are you sure you want to delete # %s?', $group['Group']['id'])); ?> </td> </tr> <?php endforeach; ?>
テーブルの値を表示する[‘Group’][‘ID’]と、ViewとかEditとかDeleteとかを表示する部分が[‘Group’][‘id’]となっています。
これでわかりました。ID と id は別物扱いです。テーブルのカラムは大文字のIDですので、id ではデータが取得できず、エラーとなってしまう、、、ということのようですね。
では、カラム名を小文字にして、最初からやり直して見ましょう。
やり直し
SQL のポイントは、カラムの物理名を小文字にすることです。
- ID → id
- NAME → name
- CREATED → created
- MODIFIED → modified
create table groups ( id int not null auto_increment, name varchar(100), created datetime, modified datetime, primary key (id) );
これでテーブルを作って bake しなおしてみました。
foreach ($groups as $group): ?> <tr> <td><?php echo h($group['Group']['id']); ?> </td> <td><?php echo h($group['Group']['name']); ?> </td> <td><?php echo h($group['Group']['created']); ?> </td> <td><?php echo h($group['Group']['modified']); ?> </td> <td class="actions"> <?php echo $this->Html->link(__('View'), array('action' => 'view', $group['Group']['id'])); ?> <?php echo $this->Html->link(__('Edit'), array('action' => 'edit', $group['Group']['id'])); ?> <?php echo $this->Form->postLink(__('Delete'), array('action' => 'delete', $group['Group']['id']), null, __('Are you sure you want to delete # %s?', $group['Group']['id'])); ?> </td> </tr> <?php endforeach; ?>
テーブルの値を表示する[‘Group’][‘id’]と、ViewとかEditとかDeleteとかを表示する部分の[‘Group’][‘id’]が一致しています!
エラーも起きていません!
おわりに
結論!CakePHP の恩恵を受けるためにはテーブルのカラム名は小文字にするべしですっ!規約には明記されていないけど、きっと当たり前扱いなんでしょう♪