Yii2: Behaviors для нормального отображения даты create/update


При использование ActiveRecord можно запрограммировать behaviors на автоматическое создание или обновление полей «created_at», «updated_at» при соответствующим действии с записью.

При использовании стандартного поведения

 return [
            TimestampBehavior::className(),
        ];

в случае с mongodb в указанных столбцах будет присутствовать число, работать с которым не очень удобно.

   "created_at": NumberInt(1535906090),
   "updated_at": NumberInt(1535906090)

Это легко можно исправить.

Указанное ниже поведение:

use yii\behaviors\TimestampBehavior;
 
    public function behaviors()
    {
        return [
            'timestamp' => [
                'class' => TimestampBehavior::className(),
                'attributes' => [
                    static::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
                    static::EVENT_BEFORE_UPDATE => ['updated_at'],
                ],
                'value' => function () {
                    return new \MongoDB\BSON\UTCDateTime();
                }
            ],
        ];
    }

Приведет к изменению формата записи даты (время в UTC и пока это никак не правится!):

  "created_at": ISODate("2018-09-02T18:10:27.675Z"),
  "updated_at": ISODate("2018-09-02T18:10:27.675Z")

С учетом особенностей, код для поиска нужной записи с учетом времени немного изменится:

function toIsoDate($timestamp){
   return new \MongoDB\BSON\UTCDateTime($timestamp * 1000);
}
 
 
public function today(){
    $finder = self::find();        
    $startDay = strtotime('midnight',time())-1;//start of day
    $endDay   = time(); //now
    $d1=to_isoDate($startDay);
    $d2=to_isoDate($endDay);         
    $finder->andWhere(['>=', 'created_at', $d1]);
    $finder->andWhere(['<=', 'created_at', $d2]);
    return $finder;
}
Вы можете оставить комментарий ниже.