Php Yii2:获取具有行为的属性的值

Php Yii2:获取具有行为的属性的值,php,model,yii2,Php,Model,Yii2,我使用的时间戳行为如下: 公共功能行为(){ 返回[ [ 'class'=>\yii\behaviors\TimestampBehavior::className(), “CreateDataAttribute”=>“usr\u日期\u添加”, 'UpdateDataAttribute'=>'usr\u日期\u修改', 'value'=>new\yii\db\Expression('UTC_TIMESTAMP()'), ], ]; } 然后如果像这样通过经过身份验证的用户访问它 Yii::$a

我使用的时间戳行为如下:

公共功能行为(){
返回[
[
'class'=>\yii\behaviors\TimestampBehavior::className(),
“CreateDataAttribute”=>“usr\u日期\u添加”,
'UpdateDataAttribute'=>'usr\u日期\u修改',
'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;
如果我这样做,我正确地得到了实际值:

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;

为什么呢?如何通过identity属性获取实际值?

数据库中未保存的
值包含有关如何创建此实际值的信息-在您的案例中,它使用
UTC\u TIMESTAMP()
MySQL函数,将在将此对象保存到数据库中时调用该函数

当您检索已经保存在数据库中的对象时,它会获取保存在数据库中的任何内容(在您的例子中是这个MySQL函数的结果),因此它会给您实际的时间戳


保存对象之前,没有必要检查此值。

数据库中未保存的
包含有关如何创建此实际值的信息-在您的情况下,它使用
UTC\u TIMESTAMP()
MySQL函数,将在将此对象保存到数据库中时调用该函数

当您检索已经保存在数据库中的对象时,它会获取保存在数据库中的任何内容(在您的例子中是这个MySQL函数的结果),因此它会给您实际的时间戳


保存对象之前,没有必要检查此值。

我意识到我修改了一个属性,然后调用了
save()
方法。您可能会认为它应该在调用
save()
后保留实际值,但它没有-我猜是因为执行
更新
查询时,数据库不会返回值。您需要调用
refresh()
方法(请参阅)进行另一次
SELECT
查询以获取新值。所以你需要这样做:

Yii::$app->user->identity->usr\u last\u access=gmdate('Y-m-dh:i:s');
Yii::$app->user->identity->save();
Yii::$app->user->identity->refresh();

我意识到我修改了一个属性,然后调用了
save()
方法。您可能会认为它应该在调用
save()
后保留实际值,但它没有-我猜是因为执行
更新
查询时,数据库不会返回值。您需要调用
refresh()
方法(请参阅)进行另一次
SELECT
查询以获取新值。所以你需要这样做:

Yii::$app->user->identity->usr\u last\u access=gmdate('Y-m-dh:i:s');
Yii::$app->user->identity->save();
Yii::$app->user->identity->refresh();

但是记录已经存在-请注意,是用户登录的。现在我看到它只给出了表达式,因为我更新了模型中的“last access”字段——如果我跳过它,我会很好地返回值。但是我确实在设置了“last access”属性之后调用了save()方法,所以它仍然应该给我我想要说的真实值……但是记录已经存在了——请注意,是用户登录的。现在我看到它只给出了表达式,因为我更新了模型中的“last access”字段——如果我跳过它,我会很好地返回值。但是我确实在设置了“last access”属性之后调用了save()方法,所以它仍然应该给我实际的值,我会说。。。