Overview
CakePHP3のMigration
ファイル及びTable
クラスで、
MySQLのBIT型を扱おうとした際に、調査とひと手間の実装が必要だったのでメモっておく。
ちなみに経緯は以下のような感じ
- CakeアプリでDBにフラグ用カラムを追加したくなった
- 下記記事などを参照してBIT型にしようと思った
MySQLに真偽値を格納する場合はbit(1)型のフィールドが最適 - Qiita - 公式ドキュメントの Migrations - 3.x にはPhinxで扱える型リストにはBIT型の記述がなかった
- ただ調べたところ Feature Request: MySQL BIT type · Issue #1106 とか Fix MySQL BIT Column Type (#1106) by shbmira · Pull Request #1248 などがあるので利用できそうだった
-
Migration
の記述はそのままで行けたが、Seed
やTable
での保存がうまく動作しなかった
Environment
- CakePHP 3.7.6
- mysqld Ver 5.7.27
Solutions
- マイグレーションファイルでのBIT型カラムの作成。
ここはそのまま型にbit
を指定して動作した。
$table->addColumn('is_flag', 'bit', [
'comment' => 'フラグカラム',
'default' => 0,
'limit' => 1,
'null' => false,
]);
- BIT型カラムがある
Table
クラスで_initializeSchema
メソッドをオーバーライドして
setColumnType
関数にて、BIT型カラムに対してboolean
を指定する必要があった。
class BitTable extends Table
{
protected function _initializeSchema(TableSchema $schema)
{
parent::_initializeSchema($schema);
$schema->setColumnType('is_flag', 'boolean'); # BIT型カラムに対して`boolean`を指定する
return $schema;
}
...
}
- 上記記述を追加した所、以下のようにCake側では
boolean
として、
またテーブルレコードとしてはBIT型のb'0'
・b'1'
として扱えるようになった。
# 疑似コード
$bitTableRecord->is_flag = true;
$bitTable->save($bitTableRecord);