Yii2:在afterFind()函数中排除属性

时间:2018-01-04 13:18:43

标签: php gridview yii yii2

我在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()"转换的格式模型中的功能。

如何保存未转换的时间戳值?

3 个答案:

答案 0 :(得分:3)

要处理created_atupdated_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);