以下のbug_examplesテーブルには、いくつがバグがある。
バグを修正したり、コマンドの打ち間違いを訂正しながら対応する例を示す。
バグの内容
主キー(primary key)のフィールド名が id_numberになっている。CakePHPでは単に id という名前を用いる
テーブルに主キーが設定されていない
MySQLの予約語 match をフィールド名に用いている。match以外にも予約語で使えない単語が有るので注意する。
外部キーのplayer_idフィールドがある。このような名称のフィールドが有る場合は players テーブルがCakePHPでは必要になる。
次の画像はbakeでモデル名(テーブル名)を打ち間違えた例
枠内の英文の意味は 「bug_exampleがデータベースに存在しない」
bakeしたいテーブルが bug_examples なので bug_example を bug_examplesに書き換えて再び実行する。
枠内の意味は 「主キーが存在しない」
phpMyAdminでテーブルに主キーを設定する。また主キーのフィールド名を id に修正する。
phpMyAdminでテーブルを修正した例
枠内の意味は「上書きしますか?」
テーブルを修正したら bakeし直す必要がある。bakeでプログラムを自動生成するので生成済みのコードが上書きされる。
その際に以下が表示されるがこれはエラーではない。次のアクションの選択メニューなので、a をキー入力して、Enterキーで実行する。
bakeコマンドで以下のようなエラーが出る。
associations(アソシエーション) テーブルとテーブルの対応関係。カーディナリティの設定のこと。1対多 多対多の対応関係を設定する。
テーブル名に、他のテーブル名が含まれているか確認して、含まれている場合は名前を変更する。
他のテーブル名を含んでいてよいのは、テーブル間の多対多の関係専用の中間テーブルだけ。
テーブル名の変更はSQLタブからコマンドで実行
alter table 変更前の名前 rename to 変更後の名前
gamesテーブルがあるのにrental_gamesがある。
rentalsに名前を修正した
テーブルを修正したので rentalsテーブルをbakeする。
枠内の意味は「コントローラが有りません」
URLを指定してWebシステムを起動すると以下のようなエラーが起きることがある。
確認
bug_examples のような アンダーバー _ を含むテーブル名についてはURLではハイフン - に修正して呼び出す必要がある。
bug-example のようにテーブル名には s が付いているのにURLでは s を付け忘れていないか?
赤帯の部分の意味は「Playersクラスが見つからない」
bakeした bug_exmaples テーブルのフィールドに player_id フィールドが有るので、CakePHPが players テーブルを要求している。
対処方法は3パターン
1.playersテーブルがMySQLに用意してある場合は、playersテーブルをbakeする。
2.playersテーブルが無い場合は、
2-A playersテーブルに相当するテーブルがあるならフィールド名を修正して対応する。
playersではなくて usersだったら、 player_idをuser_idに修正する。
2-B playersテーブルに相当するテーブルが無い場合は、フィールド名から id の部分を除去して修正する。
以下の例は、playersテーブルが無いのでフィールド名を player_id から player_nameに修正した例
デーブルを修正した場合は、bake all する必要がある。
1回のbakeではコードが更新されない場合が有るので、bakeを2回繰り返す。
赤帯の部分の意味「データベースのエラー」
bakeしたテーブルのフィールド名にMySQLやPHPの予約語が存在している場合にエラーが起きる。
phpMyAdminでフィールド名を修正して、テーブルをbakeし直す。
ここではフィル―ド match を match_field に修正した。
rentalsテーブルが存在していてbugsテーブルから外部キーで参照する場合は
bugsテーブルのフィールド名を
rental_id
にする。
テーブルのフィールド名を修正後にbugsを bake しなおす。
rentals_id を rental_idにしてbakeしなおす
主キーの値が重複した統合制約違反。
CakePHPではMySQLのテーブルの設定で主キー id に PRIMARY 属性と AUTO_INCREMENT 属性の両方が必要。
phpMyAdminで設定を確認して修正する。