Timestamp ビヘイビア

Posted by muchag | CakePHP 3.x | 2018-02-24 (土) 23:14:53

データに更新日付情報を追加してくれるビヘイビア。

公式:Timestamp

【環境】
CakePHP: 3.5.11
php: 7.1.5
設定

Table::initialize にて設定。


class ArticlesTable extends Table
{
    public function initialize(array $config)
    {
        $this->addBehavior('Timestamp');
    }
}

このように記述するだけで、下記のように動作する。

  • created:新規登録時のみ日付を追加
  • modified:常に日付を追加

メッチャ便利!

デフォルト

なぜ、上記のようになるのかというと、
デフォルトの設定が下記のようになっているから。

/vendor/cakephp/cakephp/src/ORM/Behavior/TimestampBehavior.php

protected $_defaultConfig = [
    'implementedFinders' => [],
    'implementedMethods' => [
        'timestamp' => 'timestamp',
        'touch' => 'touch'
    ],
    'events' => [
        'Model.beforeSave' => [
            'created' => 'new',
            'modified' => 'always'
        ]
    ],
    'refreshTimestamp' => true
];
カスタマイズ

設定内容をカスタマイズしたければ、ビヘイビア登録時にオプションとして設定する。


$this->addBehavior('Timestamp', [
    'events' => [
        'Model.beforeSave' => [
            'created_at' => 'new',
            'updated_at' => 'always',
        ],
        'Orders.completed' => [
            'completed_at' => 'always'
        ]
    ]
]);
  • created, modified カラム名
  • created, modified の挙動
    • new:新規登録のときのみ日付を追加
    • existing:更新のときのみ日付を追加
    • always:常に日付を追加
  • 任意カラムへ更新日時を登録

このようなことが可能。

touch

データの更新はないけど、タイムスタンプだけ更新したいときのメソッド。


// Model.beforeSave イベントに基づいて touch します
$articles->touch($article);

// 指定したイベントに基づいて touch します
$orders->touch($order, 'Orders.completed');
dirty

touch とは逆に、タイムスタンプを更新したくないときのメソッド。


// modified カラムを dirty としてマークして、更新時に現在の値がセットされるようにします。
$order->setDirty('modified', true);

// 3.4.0 より前
$order->dirty('modified', true);
参考サイト

あかつきのお宿:CakePHP3を触ってみました 〜あれ、updatedは?〜(2015-11-14)
→挙動の部分を参考にさせていただいた

Qiita:cakephp3 modified のみ変更 touch(2017-02-04)
→touch についての記事。まだ読んでいない

CakePHP 3.x | 2018-02-24 (土) 23:14:53 |

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment