Mysql 时间戳字段只能通过Yii中的行为进行更新

Mysql 时间戳字段只能通过Yii中的行为进行更新,mysql,datetime,yii,timestamp,Mysql,Datetime,Yii,Timestamp,在我的模型中,我在安全验证器中定义了一个名为timestamp MySQL type:timestamp的字段,我无法手动编写它。每次我打电话: $model->timestmap = time(); $model->save(); 模型保存在创建/更新的行中,也就是说,它通过了验证,没有错误,但时间戳字段填充了默认值0000-00-00 00:00:00。我决定删除更新当前时间戳属性的默认值,我不希望MySQL处理这个问题 然而,当我删除上面的代码并附加时,字段在update和c

在我的模型中,我在安全验证器中定义了一个名为timestamp MySQL type:timestamp的字段,我无法手动编写它。每次我打电话:

$model->timestmap = time();
$model->save();
模型保存在创建/更新的行中,也就是说,它通过了验证,没有错误,但时间戳字段填充了默认值0000-00-00 00:00:00。我决定删除更新当前时间戳属性的默认值,我不希望MySQL处理这个问题

然而,当我删除上面的代码并附加时,字段在update和create上都被正确的值填充,没有任何问题

会发生什么,或者我错过了什么?当我的手动尝试失败时,如何能够在没有问题的情况下更新行为字段?这是因为列类型是timestamp,而不是datetime或int吗

我总是被告知,第一条线索,为什么某些属性没有保存,是因为它没有列在安全验证程序列表中,或者是因为它列在不安全验证程序列表中。但这一个列在安全列表中。

我假设您的数据库字段是一个字段,查看您的默认值,但您用。请尝试使用以下选项:


我通常使用$model->timestamp=date'Y-m-dh:I:s',它可以完美地工作

,正如其他答案所建议的:

时间戳需要在保存时以某种方式转换为与MySQL兼容的日期格式字符串,在加载时以另一种方式转换。现在,您已经发现CTIMESTAMP行为可以为您实现这一点,但不幸的是,它并不关心加载。 IMO为您提供的最佳解决方案是:

public function beforeSave()
{
   $this->timestamp = date('Y-m-d H:i:s', $this->timestamp);
   return parent::beforeSave();
}

public function afterSave()
{
   // Turn it back into a unix timestamp in case you want to continue working with the record
   $this->timestamp = CDateTimeParser::parse($this->timestamp, 'yyyy-MM-dd hh:mm:ss');
   parent::afterSave();
}

public function afterFind()
{
   $this->timestamp = CDateTimeParser::parse($this->timestamp, 'yyyy-MM-dd hh:mm:ss');
   return parent::afterFind();
}
一个愚蠢的时间戳需要做很多工作,所以对于我自己,我有一个自动类型转换行为,我链接到我的模型。此行为使用表元数据自动处理所有内容。在这方面投资可能是个好主意。我曾考虑过让我的开源,但这有点乱

但是上面的代码将为您提供在执行期间使用unix的时间,并且在保存时,它将临时转换为mysql日期时间字符串


希望有帮助

我总是使用CDbExpression+CDateTimeParser为1+1。Yii什么都有课吗?:]我已经使用这个框架将近5年了,但我仍然每隔几天就会发现新的东西;谢谢大家给我启发性的回答和遗憾,我只能接受其中一个。我决定继续使用CTI作为我的案例中最简单的解决方案。
public function beforeSave()
{
   $this->timestamp = date('Y-m-d H:i:s', $this->timestamp);
   return parent::beforeSave();
}

public function afterSave()
{
   // Turn it back into a unix timestamp in case you want to continue working with the record
   $this->timestamp = CDateTimeParser::parse($this->timestamp, 'yyyy-MM-dd hh:mm:ss');
   parent::afterSave();
}

public function afterFind()
{
   $this->timestamp = CDateTimeParser::parse($this->timestamp, 'yyyy-MM-dd hh:mm:ss');
   return parent::afterFind();
}