【CakePHP4入門】bakeでモデルに対応するテーブル名を規約に準拠させない場合

CakePHP4のbakeで、モデルに対応するテーブル名を規約に準拠させない場合

既存システムをCakePHPに移行する場合など、そのシステムに応じたテーブル名が既に付いている場合があります。
他のシステムと連携していたりすると、テーブル名を変更することもできなかったりします。

以下のCakePHP公式サイトでは、データベースのテーブル名の規約は、「CakePHP のモデルに対応するテーブル名は、複数形でアンダースコア記法」となっていました。
参考 データベースの規約

例えば現行システムで上記のルールに則っていない「company_tbl」という名前のテーブルがあったとします。
この場合、以下のように「bake」コマンドでモデルを生成すると、

./bin/cake bake model company_tbl

上記の規約の解釈からCakePHPは自動的に「CompanyTbl.php」というEntityファイルと、「CompanyTblTable.php」というTableファイルを生成してくれます。
しかし、「Tbl」というのが邪魔なので、Controllerなどでは、「Company」「CompanyTable」というクラス名で扱いたいです。

その場合、bakeに「table」オプションを指定してあげればよいです。
上記の例の場合は、次のようなコマンドになります。

./bin/cake bake model --table company_tbl company

ちゃんとTableクラス名を「モデルの複数形+Table」としたければ、

./bin/cake bake model --table company_tbl companies

とすればよいです(この場合でもEntityは単数形のCompanyになります)。

一般化して書くと以下のようになります。

./bin/cake bake model --table 【実際のテーブル名】 【モデル名】

モデル名を基にTableクラスとEntityクラスが生成されます。

モデルに対応するテーブル名を規約に準拠させない場合の例

今回のcompany_tblは以下のような構成にしています。

select * from company;
+----+-----------------------------+
| id | name                        |
+----+-----------------------------+
|  1 | ABCカンパニー               |
|  2 | XXX商事                     |
|  3 | あいうえお株式会社          |
+----+-----------------------------+

この結果生成されたTableクラスは次のようになりました。

class CompaniesTable extends Table
{
    /**
     * Initialize method
     *
     * @param array $config The configuration for the Table.
     * @return void
     */
    public function initialize(array $config): void
    {
        parent::initialize($config);

        $this->setTable('company_tbl');
        $this->setDisplayField('name');
        $this->setPrimaryKey('id');
    }

    /**
     * Default validation rules.
     *
     * @param \Cake\Validation\Validator $validator Validator instance.
     * @return \Cake\Validation\Validator
     */
    public function validationDefault(Validator $validator): Validator
    {
        $validator
            ->integer('id')
            ->allowEmptyString('id', null, 'create');

        $validator
            ->scalar('name')
            ->maxLength('name', 255)
            ->allowEmptyString('name');

        return $validator;
    }
}

(クラス部分のみ抜粋)

「$this->setTable(‘company_tbl’);」のところがポイントです。

ちなみにEntityは次のようになりました。

class Company extends Entity
{
    protected $_accessible = [
        'name' => true,
    ];
}

(クラス部分のみ抜粋)

今回のオプションを知るまでは、一度生成したモデルのモデル名を変更するという手間を踏んでいたので、今回のオプションがあってだいぶ楽になりました。備忘として載せておきます。
また、他にも「bake model」コマンドのオプションで色々と指定できそうなので、別でまとめてみたいと思います。