2014-05-13 34 views
13

在我的一些測試中,我創建了一個用戶模型,並運行了一些需要保存某些屬性的方法。在rails中,我通常會調用類似user.reload的東西,這會重新填充數據庫中的屬性。laravel中的重裝模型

laravel有沒有辦法做到這一點?我通過api閱讀,並找不到它的一種方法:http://laravel.com/api/4.1/Illuminate/Database/Eloquent/Model.html任何想法在「正確」的方式來做到這一點?

+0

也許getDirty()方法可以幫助你。 http://laravel.com/api/source-class-Illuminate.Database.Eloquent.Model。html#2149-2167 –

回答

8

我也看不見它。看起來你必須:

$model = $model->find($model->id); 

您也可以自己創建之一:

public function reload() 
{ 
    $instance = new static; 

    $instance = $instance->newQuery()->find($this->{$this->primaryKey}); 

    $this->attributes = $instance->attributes; 

    $this->original = $instance->original; 
} 

只是測試它在這裏,它看起來它的工作原理,不知道這到底去,不過,Eloquen是一個相當大的班級。

1

我相信@Antonio的答案是最正確的,但根據使用情況,您也可以使用$model->setRawAttributes$model->getAttributes的組合。

​​

主要缺點這是你唯一的「重裝」的數據屬性,而不是你已經改變,這也可能被認爲是加方任何關係等。

編輯

由於L5的 - fresh()是去

27

有提交4.0分支在八月作出補充重載()方法commit的方式,但到目前爲止,它不是招並未與新的Laravel分支合併。

但是... Laravel 5提供了一種「新鮮()」方法,將返回當前模型的新實例。一旦你使用Laravel 5.0或更新版本,您可以重新加載這樣的模式:

$model = $model->fresh(); 

注意,新鮮的()不直接更新現有的$模式,它只是返回一個新的實例,所以這是爲什麼我們需要使用「$ model =」。它也接受一個參數,它是一個你想要加載的關係數組。

如果你還沒有使用Laravel 5,但你要相同的功能,你可以將這個方法添加到模型(一個或多個):

public function fresh(array $with = array()) 
{ 
    $key = $this->getKeyName(); 
    return $this->exists ? static::with($with)->where($key, $this->getKey())->first() : null; 
} 
+0

這可能值得用laravel-5標籤創建一個新問題。 – alexw

2

由於PR#19174可用,因爲5.4.24refresh method

$model->refresh(); 

這樣你就不必處理重新分配如圖所示在其他的答案與fresh方法,如果要刷新一個已經傳入,因爲變量的另一種方法的模型通常是無益分配將超出調用上下文以後使用的範圍。

+1

這也適用於利用模型活動! – kjdion84