CakePHP3 (3.2以降): クエリビルダーで DATE 型のフィールドを取得すると、Cake\I18n\FrozenDate オブジェクトが返される

  • クエリビルダで DATE 型のフィールドを取得すると、Cake\I18n\FrozenDate オブジェクトが返される
  • 同じく、DATETIME 型を取得すると、Cake\I18n\FrozenTime オブジェクトが返される

サンプル

var_dump( $query->find()-> .... ->get('field_date') ); //field_date = DATE 型のフィールド

↓

// Cake\I18n\FrozenDate オブジェクトが返される
object(Cake\I18n\FrozenDate)#2802 (3) {
  ["time"]=>
  string(25) "2019-11-07T00:00:00+00:00"
  ["timezone"]=>
  string(3) "UTC"
  ["fixedNowTime"]=>
  bool(false)
}

ドキュメントより抜粋

3.2 移行ガイド - 新しいイミュータブルな Date と Time オブジェクト

3.2 では、ORM は イミュータブルオブジェクトと date/datetime カラムをマッピングすることができます

データベースの基本 - データの型

date
この型の戻り値は、ネイティブな DateTime クラスを拡張した Cake\I18n\Date です。

デフォルトでイミュータブルオブジェクトが有効になります

備考: Cake\I18n\FrozenDate オブジェクトから日付を取得する方法

ハマった事: フォーマットの指定は大文字の YYYY でなく、小文字の yyyy

2019/12/15 追記

こっちのほうがシンプル

  • $query->find()-> .... ->get('field_date')->toDateString()
  • $query->find()-> .... ->get('field_date')->toDateTimeString()
// app/vendor/cakephp/chronos/src/Traits/FormattingTrait.php

trait FormattingTrait
{

    /**
     * Format the instance as date
     *
     * @return string
     */
    public function toDateString()
    {
        return $this->format('Y-m-d');
    }