Yii2 - сохраняет и отображает DateTime в разных форматах - PullRequest
0 голосов
/ 18 октября 2018

Мне нужно сохранить атрибут «create_at» в формате MySQL «гггг-мм-дд чч: мм: сс», но отобразить в формате php «dmY».

В сценарии создания работает нормально, нокогда я обновляю какой-либо атрибут и сохраняю, он автоматически перезаписывает «create_at» и устанавливает значение «0000-00-00 00:00:00» в БД.Я использую две функции в модели beforeValidade () и afterFind () .

common \ models \ Oficios.php

public function beforeValidate()
{
    if ($this->scenario == self::SCENARIO_CREATE){
        $this->created_at = date('Y-m-d H:i:s');
    }else {
        $this->created_at = $this->created_at;
    }

    return parent::beforeValidate(); 
}

public function afterFind ()
{
    // convert to display format
    $this->created_at = strtotime ($this->created_at);
    $this->created_at = date ('d-m-Y', $this->created_at);

    parent::afterFind ();
}

Ответы [ 4 ]

0 голосов
/ 23 октября 2018

Если созданный_кат сохранен как Unix как использование Yii::$app->formatter->asDate($model->created_at,'d-m-Y')

0 голосов
/ 18 октября 2018

Почему вы не используете TimestampBehavior в своей модели данных?Вы можете легко решить эту проблему с помощью этого поведения (https://www.yiiframework.com/doc/guide/2.0/en/concept-behaviors#using-timestamp-behavior), не делая вручную.

Как указано в документации:

Это поведение поддерживает автоматическое обновление отметки времениатрибуты модели Active Record при каждом сохранении модели с помощью методов insert (), update () или save ()

0 голосов
/ 19 октября 2018

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

public function behaviors()
    {
        return [
            [
                'class' => TimestampBehavior::class,
                'createdAtAttribute' => 'created_at',
                'updatedAtAttribute' => 'created_at',
                'value' => date('Y-m-d H:i:s')
            ],
            [
                'class' => AttributeBehavior::class,
                'attributes' => [
                    ActiveRecord::EVENT_AFTER_FIND => 'created_at'
                ],
                'value' => function ($model) {
                    // Any Format you want
                    return date('d-m-Y', strtotime($model->created_at));
                }
            ]
        ];
    }
0 голосов
/ 18 октября 2018

вы можете попробовать это:

public function rules()
{
    return array(
        ...
        array('created_at','default',
              'value'=>date('Y-m-d H:i:s'),
              'setOnEmpty'=>false,'on'=>'insert')
    );
}

и исключить функцию "beforeValidate"

Надеюсь, это вам поможет.

...