CakePHP

 先日、PHPのフレームワーク「CakePHP」でシステムを作っているとBoolean型で作ったカラムにFalseが登録できない問題に悩まされたので下記に明記しておきます。

 まずは下記のテーブルがMySQLにあったとします。

CREATE TABLE IF NOT EXISTS `testers` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `flag` tinyint(1) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`)
);

 突っ込みどころがいろいろとありそうなテーブルですが、まぁ、その辺は置いておいて。

 このテーブルにはいくつかのデータが入っています。下記ソースでその一つのデータを取り出してみます。

$params = array(
    'conditions' => array(
        'Tester.id' => 5,
    ),
    'recursive' => -1,
    'fields' => array(
        'Tester.*',
    ),
);

$data = $this->find('first', $params);

 すると下記のような結果が返ってきます。

array(1) {
  ["Tester"]=>
  array(4) {
    ["id"]=>
    string(1) "5"
    ["flag"]=>
    bool(false)
    ["created"]=>
    string(19) "2015-04-01 12:00:00"
    ["modified"]=>
    string(19) "2015-04-01 12:00:00"
  }
}

 まぁ、別に変な値じゃありませんよね。で、このデータをそのまま保存してみます。ソースは下記の通りです。

$res = $this->save($data);

 すると、変数「$res」はFalseを返してきて登録させてくれないんです。何で?ってなりますよね。悩みました。そして、その原因は「flag」カラムの「False」がダメだそうです。

 「flag」カラムの方はtinyint(1)です。DBを作るときにphpMySQLを使うことが多いのですが、このflagカラムは「Boolean」型ので作りました。しかし、型はtinyint(1)になります。この型は127~-127までの数値を保存することができます。なぜ、このtinyint(1)に変わるかは仕様なのかよくわかりません。

 このtinyint型は数字専用なので、「False」などは当たり前ですが、登録できません。けど、CakePHPが自動で変換してくれるのかと思ったら、そんなに優しくはないようですね。しかし、このカラムのデータを取り出すと「False」が返ってくるのはCakePHPが親切丁寧に変換してくれるようです。

 仕方がないのでデータを登録する場合は

$data['Tester']['flag'] = ($data['Tester']['flag'] ? 1 : 0);

などとして変換する必要があるようです。長くCakePHPを使っているけど、こんなところではまるとは思わなかったな~(^^;

 ん~。CakePHPは甘いケーキなのか、渋いケーキなのかどっちなんだろうな~
( ̄へ ̄|||) ウーム

アマゾンのサーバでエラーが起こっているかもしれません。
一度ページを再読み込みしてみてください。