Yii2 从整数转换为日期时间以显示并用整数保存到数据库中
Yii2 Convert from integer to datetime to display and save into database with integer
我有一个 table 列 for_date
以整数类型保存在数据库中。
为了以 DateTime 格式显示 for_date
,我使用了 ActiveForm 代码:
<?= $form->field($model, 'for_date')->textInput([
'class' => 'form-control datepicker',
'value' => $model->for_date ? date(Yii::$app->params['dateFormat'], $model->for_date) : date(Yii::$app->params['dateFormat'], time()),
'placeholder' => 'Time'])
->label('Attendance Date') ?>
但是当我创建和保存时,Yii 通知了 This field must be integer
在模型文件中,我在验证之前有以下2个函数要转换,但仍然出错。
public function beforeValidate(){
if(!is_int($this->for_date)){
$this->for_date = strtotime($this->for_date);
$this->for_date = date('d/M/Y', $this->for_date);
}
return parent::beforeValidate();
}
public function afterFind(){
$this->for_date = \Yii::t('app', Yii::$app->formatter->asDate($this->for_date));
$this->for_date = date('d/M/Y', $this->for_date);
return parent::afterFind();
}
如何才能正确保存到数据库中的整数?
根据您的代码,for_date
在 beforeValidate
运行后仍处于日期格式,原因是:
$this->for_date = date('d/M/Y', $this->for_date);
删除此行,它应该可以工作。
但是您仍然会遇到问题,例如日期格式或输入无效日期的人,例如 30/02/2015
。
我建议创建一个单独的 属性 例如for_date_display
并为此添加日期规则。然后在 beforeSave
中将此日期转换为时间戳并将 for_date
设置为此值,如下所示:
public $for_date_display;
...
public function afterFind() {
$this->for_date_display = \Yii::t('app', Yii::$app->formatter->asDate($this->for_date))
}
public function beforeSave($insert = true) {
$this->for_date = strtotime($this->for_date_display);
return parent::beforeSave($insert);
}
我找到了解决方案。在模型搜索中(我的情况是 AttendanceSearch.php
),查找规则函数并将 for_date
从行 integer
移动到下面的行 safe
我的代码:
public function rules()
{
return [
[['id', 'user_id', 'project_id', 'commit_time', 'workload_type'], 'integer'],
[['comment', 'for_date'], 'safe'],
];
}
我有一个 table 列 for_date
以整数类型保存在数据库中。
为了以 DateTime 格式显示 for_date
,我使用了 ActiveForm 代码:
<?= $form->field($model, 'for_date')->textInput([
'class' => 'form-control datepicker',
'value' => $model->for_date ? date(Yii::$app->params['dateFormat'], $model->for_date) : date(Yii::$app->params['dateFormat'], time()),
'placeholder' => 'Time'])
->label('Attendance Date') ?>
但是当我创建和保存时,Yii 通知了 This field must be integer
在模型文件中,我在验证之前有以下2个函数要转换,但仍然出错。
public function beforeValidate(){
if(!is_int($this->for_date)){
$this->for_date = strtotime($this->for_date);
$this->for_date = date('d/M/Y', $this->for_date);
}
return parent::beforeValidate();
}
public function afterFind(){
$this->for_date = \Yii::t('app', Yii::$app->formatter->asDate($this->for_date));
$this->for_date = date('d/M/Y', $this->for_date);
return parent::afterFind();
}
如何才能正确保存到数据库中的整数?
根据您的代码,for_date
在 beforeValidate
运行后仍处于日期格式,原因是:
$this->for_date = date('d/M/Y', $this->for_date);
删除此行,它应该可以工作。
但是您仍然会遇到问题,例如日期格式或输入无效日期的人,例如 30/02/2015
。
我建议创建一个单独的 属性 例如for_date_display
并为此添加日期规则。然后在 beforeSave
中将此日期转换为时间戳并将 for_date
设置为此值,如下所示:
public $for_date_display;
...
public function afterFind() {
$this->for_date_display = \Yii::t('app', Yii::$app->formatter->asDate($this->for_date))
}
public function beforeSave($insert = true) {
$this->for_date = strtotime($this->for_date_display);
return parent::beforeSave($insert);
}
我找到了解决方案。在模型搜索中(我的情况是 AttendanceSearch.php
),查找规则函数并将 for_date
从行 integer
移动到下面的行 safe
我的代码:
public function rules()
{
return [
[['id', 'user_id', 'project_id', 'commit_time', 'workload_type'], 'integer'],
[['comment', 'for_date'], 'safe'],
];
}