引言
最近在寫任務中,碰到一個問題,需要批量更新多條數(shù)據(jù),但是Laravel沒有提供這樣的方法,Google了一些方法,剛好借著任務來舉例說明一下。
任務要求
任務是一個簡單的清除未讀通知的API,其實就是把通知表中符合user id 和 is read = 0 的行中的 is_read改為1(0代表未讀,1代表已讀)。
方法1
我首先想到的是利用where()方法查出user id和is read符合條件的notices,然后利用foreach循環(huán)和save()更新數(shù)據(jù)表。
$notices = Notice::where('user_id', $userId) ->where('is_read', 0) ->get(); //得到user_id 和 is_read 符合的notices foreach($notices as $notice) { $notice->is_read = 1; $notice->save(); } //更新數(shù)據(jù)表
這個方法確實可行,可是每次遍歷都會和數(shù)據(jù)庫進行通訊,當數(shù)據(jù)量很大的時候,響應速度就會很慢,也非常的浪費資源。
方法2
當我去Google一篇博文啟發(fā)了我: Laravel一次更新多條記錄,批量更新的方法
其實可以利用一條數(shù)據(jù)庫的SQL語句就搞定這個問題
UPDATE notices SET is_read = 1 WHERE user_id = 1 AND is_read =0
一次數(shù)據(jù)通訊,加快了響應速度又減少資源浪費,那么我可以這樣寫
$notices = DB::update(DB::raw("UPDATE notices SET is_read = 1 WHERE user_id = 1 AND is_read =0"));
$notices的返回值是更改的數(shù)據(jù)行數(shù)
我們以后的應用中會有很多種類似的任務,像是忽略一些通知、已讀一些消息等等,為了代碼的復用,我們可以寫一個方法,傳入表名、user_id和要修改字段名
publish function update_batch_one($table, $user_id, $column) { $q ="UPDATE".$table.SET.$column."=1WHEREuser_id=".$user_id."AND".$column."=0"; return DB::update(DB::raw($q) }
總結(jié)歸納
這兩個方法都只能解決一些特定的問題,但是提供了一種思路,有時候用SQL語句可以很方便、簡單的操作數(shù)據(jù)表,如果我們需要根據(jù)不同的條件,批量肯定多條數(shù)據(jù)的多條信息那么就需要用SQL的WHEN THEN方法了,具體思路就是在我上邊貼出來的地址里。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持。