我需要以MySQL格式“ yyyy-mm-dd hh:mm:ss”保存属性“ created_at”,但以php格式“ d-m-Y”显示。
它在创建方案中工作正常,但是当我更新任何属性并保存时,它会自动覆盖数据库中的“ created_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 ();
}
答案 0 :(得分:1)
为什么不在数据模型中使用TimestampBehavior
?您可以通过这种行为(https://www.yiiframework.com/doc/guide/2.0/en/concept-behaviors#using-timestamp-behavior)轻松解决此问题,而无需手动进行。
如文档中所述:
此行为支持自动更新时间戳记属性 只要通过insert()保存模型,就可以创建Active Record模型 update()或save()方法
答案 1 :(得分:0)
您可以尝试以下方法:
public function rules()
{
return array(
...
array('created_at','default',
'value'=>date('Y-m-d H:i:s'),
'setOnEmpty'=>false,'on'=>'insert')
);
}
并消除函数“ beforeValidate”
希望对您有帮助。
答案 2 :(得分:0)
您始终可以使用行为。这是更干净,更高级的方法。您可以控制模型具有的所有事件。这是示例:
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));
}
]
];
}
答案 3 :(得分:0)
如果created_at像使用Yii::$app->formatter->asDate($model->created_at,'d-m-Y')
一样保存为Unix