はじめに
原則としては内部向けですが、自分もはまった経験がある部分なので、もしかしたら役に立つかもしれないので公開します。(CodeIgniter3以下でも基本は同じですが、関数名の変更があるので注意してください:例えばCI3までは add_field → CI4 では addField )
データベース管理の流れ
CodeIgniter4のデータベース管理の流れを整理してまとめておきます。
php spark migrate:create <管理ファイル名>- 管理ファイルを編集して
upにアップデート内容を記述 - 管理ファイルを編集して
downにアップデートを戻す内容を記述 -
php spark migrateで完了! -
php spark db:tableなどで変更内容を確認
migrate:create で管理ファイル名の連番オプションを変更することも可能なので、プロジェクトで統一して管理してください。(例えば --suffix で <日付-管理ファイル名> の形でマイグレーションファイルが生成されます)ちなみに migrate:create を使わなくてもマイグレーションファイルを作れますが、管理面からこれを使っておいたほうが良いです。
使う関数
-
$this->forge->addField([...])→ フィールドの追加 -
$this->forge->dropField([...])→ フィールドの追加 -
$this->forge->addKey('<カラム名>')→ インデックスの追加 -
$this->forge->createTable('<テーブル名>')→ テーブルの作成 -
$this->forge->dropTable('<テーブル名>')→ テーブルの削除 -
$this->forge->addColumn('<テーブル名>', [...])→ カラムの追加 -
$this->forge->dropColumn('<テーブル名>', [...]);→ カラムの削除 -
$this->forge->modifyColumn('<テーブル名>', [...])→ カラムの定義変更
[...] にカラム定義を配列の形で入れて、基本的には以下の関数を使ってデータベースを管理しますが、既に作成されたテーブルに対して addField を適用しようとするとエラーになります。既に存在するテーブルに対してカラムの追加を行う場合は addColumn を適用してください。
変数定義
上記 [...] に代入する配列内のカラム定義の例は以下のようになります。配列は変数として与えることもできます。
'<カラム1>' => [
'type' => '<変数型>',
'constraint' => '文字数',
... <続く> ...
],
'<カラム2>' => [
'type' => '<変数型>',
'constraint' => '文字数',
... <続く> ...
],
... <続く> ...
補足
SQLAlchemyなど、DERaCで主に使っているPythonフレームワークのデータベース管理ではデータベースモデルのファイルを編集してマイグレーションコマンドを打ち込むとマイグレーションファイルが自動的に作成される形になります。CIの場合、モデルの定義はマイグレーションファイルで直接管理して、モデル定義ではデータベース操作を定義する構造になります。