2015-07-03 106 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