在activerecord类中我把这段代码
use yii\db\ActiveRecord;
use yii\behaviors\TimestampBehavior;
use yii\db\Expression;
public function behaviors()
{
return [
'class' => TimestampBehavior::className(),
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['create_time'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['create_time'],
],
];
}
但它给我一个错误
Invalid Configuration – yii\base\InvalidConfigException
Object configuration must be an array containing a "class" element.
我不知道我在哪里做错了。
我也按照这个链接
TimestampBehavior is not working in Yii2
但这也无法解决我的问题。
答案 0 :(得分:2)
以下是更正后的版本:
public function behaviors()
{
return [
[
'class' => TimestampBehavior::className(),
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['create_time'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['create_time'],
],
],
];
}
这是更深入的解释。
主要问题是你忘了将行为配置包装到自己的数组中,这就是抛出错误的原因。此配置与所有其他配置由Yii::createObject()方法处理。所以你需要包含至少class
元素的数组。如果您需要默认配置,只需指定类名即可省略此选项,例如:
public function behaviors()
{
return [
TimestampBehavior::className(),
],
];
}
除此之外,你也忘了在属性后关闭方括号。
最后,你不应该指定那样的属性。就像在这种行为的初始阶段那样,它被重构了。现在您只需要指定相应的属性名称,例如:
public function behaviors()
{
return [
[
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'created_at', // This is by default, you can omit that
'updatedAtAttribute' => 'updated_at', // This is by default, you can omit that
],
],
];
}
此外,我不认为使用相同的列来跟踪create
和update
时间是一个好主意。
此外,您可以指定用于更新这些列的value
:
use yii\db\Expression;
...
'value' => new Expression('NOW()'),
这将涉及数据库来计算时间,如果你想通过PHP在服务器端这样做,你可以使用闭包,例如:
'value' => function () {
return date('Y-m-d H:i:s');
}
还有一件事,即使它与此问题没有直接关系 - 您可以通过设置配置数组的键来为每个行为设置别名。这称为命名行为:
public function behaviors()
{
return [
'timestamp' => [
...
],
],
];
}
@GAMITG在回答中提到了这一点。
答案 1 :(得分:1)
您可以尝试使用此代码。
public function behaviors()
{
return [
'timestamp' => [
'class' => 'yii\behaviors\TimestampBehavior',
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['create_time'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['create_time'],
],
],
];
}