仅当`create_at`模型属性为null或空时才更新它

时间:2015-07-03 09:14:29

标签: php yii2 yii2-advanced-app

我在yii2-user中使用YII2高级应用程序模板。

public function behaviors()
{
    return [
        TimestampBehavior::className(),
    ];
}

这将在我的用户模型中设置当前timestamp值。但我只想在null的情况下添加它;如果我在控制器中设置了值,则不应该覆盖它。

3 个答案:

答案 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()');},
        ],
    ];
}