2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CakePHP3のTableクラスでMySQLのBIT型を利用する方法

Posted at

Overview

CakePHP3のMigrationファイル及びTableクラスで、
MySQLのBIT型を扱おうとした際に、調査とひと手間の実装が必要だったのでメモっておく。

ちなみに経緯は以下のような感じ

  1. CakeアプリでDBにフラグ用カラムを追加したくなった
  2. 下記記事などを参照してBIT型にしようと思った
    MySQLに真偽値を格納する場合はbit(1)型のフィールドが最適 - Qiita
  3. 公式ドキュメントの Migrations - 3.x にはPhinxで扱える型リストにはBIT型の記述がなかった
  4. ただ調べたところ Feature Request: MySQL BIT type · Issue #1106 とか Fix MySQL BIT Column Type (#1106) by shbmira · Pull Request #1248 などがあるので利用できそうだった
  5. Migrationの記述はそのままで行けたが、SeedTableでの保存がうまく動作しなかった

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);
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?