我在DB中有created_at和updated_at列,我正在用时间戳填充它。
要在index.php中显示created_at和updated_at日期(对于GridView中的用户),我已使用模型中的afterFind函数将时间戳转换为YYYY-MM-DD格式。
如果单击编辑按钮,则从GridView中,我需要更新行中的状态。所以控制器中的代码是
$existingRow = Project::findOne($id) // From the parameter
$existingRow->status = 2
$existingRow->save()
执行上述命令后,created_at字段将以" YYYY-MM-DD"从" afterFind()"转换的格式模型中的功能。
如何保存未转换的时间戳值?
答案 0 :(得分:3)
要处理created_at
和updated_at
,您应该使用TimestampBehavior
。在相应的模型中添加:
use yii\behaviors\TimestampBehavior;
public function behaviors()
{
return [
TimestampBehavior::className(),
];
}
然后它会在创建/更新模型时自动填充您的字段。
要在GridView
中正确显示,请将列定义为:
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
'name',
'created_at:datetime', // or 'created_at:date' for just date
// ...
],
]) ?>
afterFind()
不是这类事情的最佳解决方案。
答案 1 :(得分:0)
就像你覆盖afterFind()一样,你可以覆盖模型中的beforeSave()
方法,在执行保存操作之前将属性重新格式化为所需的格式。
protected function beforeSave()
{
$parentResult = parent::beforeSave();
// pseudo code
// Change any attributes values as you require
// return true if successful ($result)
return $parentResult && $result; // Save operation will run if this returns true only
}
答案 2 :(得分:0)
这可能不是预期的答案,但这个功能让我得到了我想要的东西。使用 $ model-&gt; getOldAttribute($ attributeName)会提供数据库中的原始数据(这是未由afterFind()函数转换的原始数据)。
$existingRow = ProjectResourceAssign::findOne($id);
$existingRow->status = 2;
// This piece of line will get you the original value of the attribute
$existingRow->created_at = $existingRow->getOldAttribute('created_at');
$existingRow->save(false);