カテゴリー
コンピューター

CakePHP2 。テーブルのカラム(列)は小文字にするとよいです♪

CakePHP- the rapid development php framework- Groups.jpg

ポイント

  • 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']); ?>&nbsp;</td>
		<td><?php echo h($group['Group']['NAME']); ?>&nbsp;</td>
		<td><?php echo h($group['Group']['CREATED']); ?>&nbsp;</td>
		<td><?php echo h($group['Group']['MODIFIED']); ?>&nbsp;</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 しなおしてみました。

CakePHP- the rapid development php framework- Groups2.jpg

	foreach ($groups as $group): ?>
	<tr>
		<td><?php echo h($group['Group']['id']); ?>&nbsp;</td>
		<td><?php echo h($group['Group']['name']); ?>&nbsp;</td>
		<td><?php echo h($group['Group']['created']); ?>&nbsp;</td>
		<td><?php echo h($group['Group']['modified']); ?>&nbsp;</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 の恩恵を受けるためにはテーブルのカラム名は小文字にするべしですっ!規約には明記されていないけど、きっと当たり前扱いなんでしょう♪

コメントを残す