我在yii2-user中使用YII2高级应用程序模板。
public function behaviors()
{
return [
TimestampBehavior::className(),
];
}
这将在我的用户模型中设置当前timestamp
值。但我只想在null
的情况下添加它;如果我在控制器中设置了值,则不应该覆盖它。
答案 0 :(得分:4)
您可以使用自定义逻辑创建new Integer(R.id.button)
:
TimestampBehavior
然后在你的模型中使用它:
<?php
namespace app\behaviors;
use yii\db\ActiveRecord;
use yii\base\Behavior;
use yii\db\Expression;
class ARTimestampBehavior extends Behavior
{
public function events()
{
return [
ActiveRecord::EVENT_BEFORE_INSERT => 'beforeInsert',
ActiveRecord::EVENT_BEFORE_UPDATE => 'beforeUpdate',
];
}
public function beforeInsert($event)
{
$model = $event->sender;
if ($model->hasAttribute('created_at') && is_null($model->created_at)) {
$model->created_at = new Expression('NOW()');
}
if ($model->hasAttribute('updated_at')) {
$model->updated_at = new Expression('NOW()');
}
}
public function beforeUpdate($event)
{
$model = $event->sender;
if ($model->hasAttribute('updated_at')) {
$model->updated_at = new Expression('NOW()');
}
}
}
答案 1 :(得分:1)
我认为没有一种简单的方法可以做到这一点。最接近的一个可以在没有太多编码的情况下指定要设置的自定义值。
public function behaviors()
{
return [
[
'class' => TimestampBehavior::className(),
'value' => function($event) {
return (/* some condition */)
? your_custom_function_returning_the_time()
: time();
],
];
}
话虽如此,我认为这可能是对TimestampBehavior
的滥用。最好为自定义创建时间戳定义新列。
如果您已开始使用当前列,请选择TimestampBehavior
并覆盖模型的beforeSave
方法:
public function beforeSave($insert)
{
if (! parent::beforeSave($insert)) {
return false;
}
if ($insert && this->create_at === null) {
$this->create_at = time();
}
$this->update_at = time();
return true;
}
答案 2 :(得分:0)
只需使用如下所示的默认TimestampBehavior:
/**
* @inheritdoc
* @return array mixed
*/
public function behaviors()
{
return [
'timestamp' => [
'class' => TimestampBehavior::class,
'createdAtAttribute' => 'created_at',
'updatedAtAttribute' => false,
'value' => function($event) {return $event->sender->created_at ?? new \yii\db\Expression('NOW()');},
],
];
}