2016-02-27 76 views
4

我想將我現有的插入方法轉換爲查詢範圍,以便我可以重用它們並有更多的DRY方法。Laravel保存()未定義

這是我想轉換成Larvel查詢範圍是什麼:

$time = new Time; 
$time->employee_id = $input['user_id']; 
$time->day   = Carbon::now()->toDateString(); 
$time->clock_in  = Carbon::now()->toTimeString(); 
$time->save(); 

這是我現在有一個查詢範圍:

public function scopeClockIn($query, $userID) { 
    $query->employee_id = $userID; 
    $query->day   = Carbon::now()->toDateString(); 
    $query->clock_in  = Carbon::now()->toTimeString(); 
    $query->save(); 
} 

這是我如何打電話以上查詢範圍:

$time = Time::clockIn($input['user_id']); 

但我得到的錯誤:

Call to undefined method Illuminate\Database\Query\Builder::save() 

我也曾嘗試:

$time = new Time::clockIn($input['user_id']); 

但是當我嘗試用new關鍵字我得到一個錯誤:

syntax error, unexpected 'clockIn' (T_STRING), expecting variable (T_VARIABLE) or '$'

谷歌還沒有非常有幫助,我發現其他具有相同錯誤消息的問題,但他們試圖檢索結果而不插入它們。希望有人能幫我弄清楚我做錯了什麼。

回答

5

好,寫得好的問題。

Laravel使用Builder通過例如與數據庫交互。構建和執行SQL查詢。一旦完成,它將返回您的時間對象 - 或收集其中。

當你這樣做時, Time::all()Time::where('something', '=', 'something')->get(),您沒有使用時間對象,而是使用生成器

作用域在「從數據庫獲取和返回數據」階段應用,這就是爲什麼你從Builder得到一個錯誤。你不能保存任何東西 - 因爲你仍在構造一個查詢,你實際上並不在一個對象的實例中。


你的想法不錯,通常是一個好主意,使事情變得更小,更明確。它不應該是一個範圍。你想要做的可能只是提供用戶ID,並使其成爲一個靜態函數。事情是這樣的:

public static function createFromUserId($userID) { 
    $time = new static(); 
    $time->employee_id = $userID; 
    $time->day   = Carbon::now()->toDateString(); 
    $time->clock_in = Carbon::now()->toTimeString(); 
    $time->save(); 
    return $time; 
} 

通知的static關鍵字,這意味着你不使用特定對象,而是在類的通用功能。這就是爲什麼你在後面的問題中得到語法錯誤的原因:Time::clockIn()中的::表明它是一種靜態方法,但是你沒有使該方法成爲靜態方法。

我還確保該方法返回創建的時間,以防您需要對其執行操作。現在,您可以創建新的時間從一個用戶ID對象只是這樣的:

$time = Time::createFromUserId($userID); 

我希望這能回答你的問題。

+0

真棒謝謝你的詳細解釋! – Yamaha32088

+0

很高興幫助。 :) –