8
6

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 5 years have passed since last update.

CakePHP3 EntityのsetでDBの型によってはまったこと

Last updated at Posted at 2016-04-25

#CakePHP3 EntityのsetでDBの型によってはまったこと

今日、普通にCakePHP3を書いてたわけですが、
patchEntityすると、データが消えるという謎現象が発生したわけですね。

具体的に起きたこと

    public function index()
    {
        $a = $this->Topics->newEntity();
        $b = [];
        $b['tiny1'] = true;
        $b['tiny4'] = true;
        $b['timestamp'] = '2016-01-01 00:00:00';
        $b['datetime'] = '2016-01-01 00:00:00';
        $a = $this->Topics->patchEntity($a, $b);
        debug($a);
    }

こんな感じなコードがあったとして、Entity先のDBのカラムはカラム名の通り、それぞれ、tinyint(1),tinyint(4),timestamp,datetimeなわけですよ。

その結果返ってくる結果がこれ

object(App\Model\Entity\Topic) {

	'tiny1' => true,
	'timestamp' => object(Cake\I18n\Time) {

		'time' => '2016-01-01T00:00:00+00:00',
		'timezone' => 'UTC',
		'fixedNowTime' => false
	
	},
	(以下略)

tiny(4)datetimeのデータが返ってきません。

さらに、以下のようにfind後にpatchEntityをした場合だと・・・

    public function index()
    {
        $a = $this->Topics->find('all')->first();
        $b = [];
        $b['tiny1'] = true;
        $b['tiny4'] = true;
        $b['timestamp'] = '2016-01-01 00:00:00';
        $b['datetime'] = '2016-01-01 00:00:00';
        $a = $this->Topics->patchEntity($a, $b);
        debug($a);
    }
object(App\Model\Entity\Topic) {

	'tiny1' => true,
	'tiny4' => null,
	'timestamp' => object(Cake\I18n\Time) {

		'time' => '2016-01-01T00:00:00+00:00',
		'timezone' => 'UTC',
		'fixedNowTime' => false
	
	},
	'datetime' => null,

なんかnullになってるーーーーーーー!?

何が起きているか

entityのsetが走るタイミングでデータの変換が行われているのですが(このへん)、型の中で想定外のものは全部nullに変換されています。(この辺とか)

今回の場合、tinyintの場合だと、桁数が1の場合はboolean,桁数が4の場合はintegerと判定されたため、tinyint(4)ではtrueは想定外のデータなのでnullという動作をしています。

tinyintはCakePHP2だと確か、桁数によらずboolean的な動作をしてたので、そのノリで使ってたら動かない!的なことになったわけですね。

日時については、timestampは文字列でも普通にいけるんですが、datetimeの場合はちゃんとtimeクラスのオブジェクトにしておかないとnullを返されてしまいます。。。

まとめ

とりあえず現状こんな問題が出てきたのはmysqlばっかりなんですけど。。。
postgresは特に今のところこんな話は出てきていません。
まぁDB設計はちゃんとしましょうってお話なんですが()

8
6
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
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?