首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >时间戳字段只能通过Yii中的行为更新。

问时间戳字段只能通过Yii中的行为更新。
EN

Stack Overflow用户
提问于 2014-04-04 13:32:48
回答 3查看 1.1K关注 0票数 0

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

代码语言:javascript
复制
$model->timestmap = time();
$model->save();

模型被保存(行创建/更新),也就是说,它通过验证而没有错误,但是timestamp字段中填充了0000-00-00 00:00:00的默认值(我决定删除默认的on update CURRENT_TIMESTAMP属性,我不希望MySQL处理这个问题)。

但是,当我移除上面的代码并附加CTimestampBehavior时,字段在更新和创建时都会被正确的值填充,没有任何问题。

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-04 13:41:05

您的数据库字段是一个datetime字段(我假设,查看默认值),但是您用一个unix时间戳填充它。用一个CDbExpression来尝试它:

代码语言:javascript
复制
$model->timestamp = new CDbExpression('NOW()');
$model->save();
票数 4
EN

Stack Overflow用户

发布于 2014-04-04 13:43:22

我通常使用$model->timestamp = date('Y-m-d H:i:s'),它工作得很完美

票数 2
EN

Stack Overflow用户

发布于 2014-04-05 07:46:54

其他答复已经表明:

时间戳需要在保存时以某种方式转换为MySQL兼容的日期格式字符串,而在加载时则相反。现在您已经发现CTimestampBehavior为您做了这件事,但不幸的是,它并不关心加载。海事组织对你来说最好的解决办法是:

代码语言:javascript
复制
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日期时间字符串。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22864309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档