2015-07-03 72 views
1

我正在使用yii2用户的YII2高级应用程序模板。仅当它为空或空白时更新`create_at`模型属性

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

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

回答

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; 
} 
+0

嗨,在你的认同ach,我需要修改每个模型中的beforeSave()函数吗? – vinod27ece

+0

是的,所以如果你有多个模型需要它,我会说@ stepozer的答案比我所建议的要好。 – tarleb

+1

是的,感谢您的快速响应。我试过@ stepozer的方法,它的作用就像一个魅力。 – vinod27ece

3

您可以创建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()'); 
     } 
    } 

} 

而且然后在你的模型中使用它:

public function behaviors() 
{ 
    return [ 
     ARTimestampBehavior::className(), 
    ]; 
} 
+0

谢谢,会试一试,然后让你知道。 – vinod27ece

+0

: - 谢谢,这解决了我的问题 – vinod27ece