CakePHP3.6のDB命名規則とbin/bake allでのエラー発生時の対応を調べてみた

この記事は最新更新日から、6年以上経過しています。

公式サイト見てもよくわからなかったので手動で一個ずつ確認した。

まとめると以下のような感じ

●tablesテーブルがあるとすると、主キーは id と table_id が使える
●othersテーブルがあったとして、tablesテーブルのidが使いたい場合は table_id というカラムをつくるとcakephpが勝手に外部キー扱いにしてくれる
●主キー(プライマリーキー)は1つにしておく(複合キーにしない、外部キー設定してもエラーが出る)
●hoge_other_tablesのテーブルのviewは http://example.com/hogeOtherTables でアクセスできる
●hogeOtherTablesのテーブルのviewも http://example.com/hogeOtherTables になるので注意
●othersテーブルに not_exist_id という物理名のカラムを作ってnot_existsテーブルがない場合はnot_existsテーブルがないというエラーになるので、どうしても not_exist_id というような名前のカラムを使いたい場合は4ファイルぐらい編集する必要がある

追記:複合主キーは使えるらしい? 今度確認する
https://book.cakephp.org/3.0/ja/quickstart.html#cms

以下エラーの対応方法など。

●主キーは「id」と「テーブル名単数型_id」 どちらも使用できる

テーブル作って確認した
仮に「tests」テーブルの主キーは「id」「test_id」が使える

●他テーブルの主キーを外部キーにする場合は「テーブル名単数型_id」を使う

こちらもテーブル作って確認した
「others」テーブルで「test」テーブルのidが使いたい場合は「test_id」を使う

●参照元のidが入ったテーブルは先にbakeしてから出ないとはView表示時に下記エラーが出る

> SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘テーブル名.(_idを除いた)複数形’ doesn’t exist
「テーブル名単数型_id」は勝手に参照設定されてしまうようなので、先に参照元テーブルをbakeしてからでないとエラーが出る

●でも複合主キーに設定してると先に参照元を先にbakeしててもはView表示時に下記エラーが出る

> Cannot match provided foreignKey for “テーブル複数形”, got “(主キー)” but expected foreign key for “(主キー, 複合主キー)”

複合キーにした(DB上はPK+FKにした)ものをテーブル参照したときは下記エラーが出る
> Cannot insert row, some of the primary key values are missing. Got (, ), expecting (id, sword_id)

https://qiita.com/matsuyoro/items/657ae737eb9be5d80407
ここを参照すると結局cakephp3では複合キーにはできないみたい?

FK設定先のbake中に下記エラーも出る
Bake cannot generate associations for composite primary keys at this time.
対応が煩雑になりそうなのでおとなしく主キー一つにした方がよさそう。

●主キーはAUTO_INCREMENT設定していないとbakeされてできたviewでは保存すると主キーが空になってエラーが出る

エラー文は取り忘れました…。

●ちなみにcakephp3上ではテーブルとして存在しない「単数型_id」が含まれたテーブルではView表示時に下記のエラーが出る

> SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘テーブル名.(_idを除いた)複数形’ doesn’t exist
修正したい場合は「(_idを除いた)複数型で書かれた部分」を消して回る必要がある
「your_database」データベースの「sites」テーブルで「profile_id」を使っているけれど、「profiles」テーブルは必要がなくて作成しないなら、下記のような感じでファイルを適切に編集してprofiles系の文字をコメントアウトしたり変更する必要がある

モデルファイル
/your_cakephp3_project/src/Model/Table/SitesTable.php

public function initialize(array $config) 内の中の文字まるごと
        //$this->belongsTo('Profiles', [
        //    'foreignKey' => 'profile_id'
        //]);
public function buildRules(RulesChecker $rules) 内の下記の文字
//$rules->add($rules->existsIn(['profile_id'], 'Profiles'));

モデルファイル
/your_cakephp3_project/src/Model/Entity/Site.php

class Site extends Entity 内の下記配列の中の文字
protected $_accessible = [
//'profile' => true,

コントローラーファイル
/your_cakephp3_project/src/Controller/SitesController.php

public function index() 内の下記の文字
        $this->paginate = [
            //'contain' => ['Profiles']
            'contain' => []
        ];
public function view($id = null)  内の下記の文字
        $site = $this->Sites->get($id, [
            //'contain' => ['Profiles']
            'contain' => []
        ]);
public function add()  内の下記の文字
        //$profiles = $this->Sites->Profiles->find('list', ['limit' => 200]);
        //$this->set(compact('site', 'profiles'));
        $this->set(compact('site'));
public function edit($id = null)  内の下記の文字
        //$profiles = $this->Sites->Profiles->find('list', ['limit' => 200]);
        //$this->set(compact('site', 'profiles'));
        $this->set(compact('site'));

まだありそうな気もするけれどとりあえずこの辺を修正すると一通り動きます。

●テーブル名が_区切りだとviewのURLがちょっと変わる(a_tables)

> Missing Controller
こういうURLでアクセスする場合はエラーになるので下記のようなURLにアクセスしようとしてもうまくいかない
http://192.168.33.10:8000/a_staff_tables

この場合は下記のような感じのURLにするとViewにアクセスできる
(アンダーバーをなくして次以降の単語は頭文字を大文字にする)
http://192.168.33.10:8000/aStaffTables

また見つけたら追記します…