我正在使用TimestampBehaviour:
public function behaviors() {
return [
[
'class' => \yii\behaviors\TimestampBehavior::className(),
'createdAtAttribute' => 'usr_date_added',
'updatedAtAttribute' => 'usr_date_modified',
'value' => new \yii\db\Expression('UTC_TIMESTAMP()'),
],
];
}
然后,如果通过经过身份验证的用户访问它...
Yii::$app->user->identity->usr_date_modified;
...我得到的是表达式而不是实际值:
object(yii\db\Expression)#38 (2) {
["expression"]=>
string(15) "UTC_TIMESTAMP()"
["params"]=>
array(0) {
}
}
如果我这样做,我就能正确得到实际价值:
$user = app\models\User::findOne(51);
echo $user->usr_date_modified;
为什么?如何通过身份属性获取实际值?
答案 0 :(得分:0)
未保存在数据库中的value
包含有关如何创建此实际值的信息 - 在您的情况下,它使用UTC_TIMESTAMP()
MySQL函数,该函数将在保存此对象时调用进入DB。
当你检索已经保存在数据库中的对象时,它会获取那里保存的任何东西(在你的情况下是这个MySQL函数的结果),所以它给你实际的时间戳。
在保存对象之前,无需检查此值。
答案 1 :(得分:0)
I realized that I have modified an attribute and then called the save()
method. You would think it should then hold the actual value after calling save()
but it doesn't - I guess because doing the UPDATE
query the database doesn't return the value. You need to call the refresh()
method (see documentation) to make another SELECT
query to get the new value. So you would need to do it like this:
Yii::$app->user->identity->usr_last_access = gmdate('Y-m-d H:i:s');
Yii::$app->user->identity->save();
Yii::$app->user->identity->refresh();