使用Laravel怎么批量更新多條數(shù)據(jù)?很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
田家庵ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!mysql case…when的用法
MySQL 的 case when 的語法有兩種:
簡單函數(shù)
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END: 枚舉這個(gè)字段所有可能的值
select id,status '狀態(tài)值', case status when 10 then '未開始' when 20 then '配送中' when 30 then '已完成' when 40 then '已取消' End '狀態(tài)' from table
輸出結(jié)果:
搜索函數(shù)
CASE WHEN [expr] THEN [result1]…ELSE [default] END
CASE WHEN [expr] THEN [result1]…ELSE [default] END:搜索函數(shù)可以寫判斷,并且搜索函數(shù)只會(huì)返回第一個(gè)符合條件的值,其他case被忽略
select id,lessee_id '租戶ID', case when lessee_id <=1 then '自用系統(tǒng)' when lessee_id >1 then '租用系統(tǒng)' End '系統(tǒng)分類' from waybill_base_info
case…when實(shí)現(xiàn)數(shù)據(jù)庫的批量更新
更新單列的值
UPDATE base_info SET city_id = CASE id WHEN 1 THEN WHEN 2 THEN WHEN 3 THEN END WHERE id IN (1,2,3)
這句sql的意思是,更新city_id 字段:
如果id=1 則city_id 的值為100010,
如果id=2 則 city_id 的值為100011,
如果id=3 則 city_id 的值為100012。
即是將條件語句寫在了一起。
這里的where部分不影響代碼的執(zhí)行,但是會(huì)提高sql執(zhí)行的效率。
確保sql語句僅執(zhí)行需要修改的行數(shù),這里只有3條數(shù)據(jù)進(jìn)行更新,而where子句確保只有3行數(shù)據(jù)執(zhí)行。
UPDATE base_info SET city_id = CASE id WHEN 1 THEN 100010 WHEN 2 THEN 100011 WHEN 3 THEN 100012 END, city_name = CASE id WHEN 1 THEN ‘北京' WHEN 2 THEN ‘上海' WHEN 3 THEN ‘廣州' END WHERE id IN (1,2,3)
不過這個(gè)有個(gè)缺點(diǎn) : 要注意的問題是SQL語句的長度,需要考慮程序運(yùn)行環(huán)境所支持的字符串長度,當(dāng)然這也可以更新mysql的設(shè)置來擴(kuò)展。
在model方法中封裝該批量更新的方法:
//批量更新 public function updateBatch($multipleData = []) { try { if (empty($multipleData)) { Log::info("批量更新數(shù)據(jù)為空"); return false; } $tableName = $this->table; // 表名 $firstRow = current($multipleData); $updateColumn = array_keys($firstRow); // 默認(rèn)以id為條件更新,如果沒有ID則以第一個(gè)字段為條件 $referenceColumn = isset($firstRow['id']) ? 'id' : current($updateColumn); unset($updateColumn[0]); // 拼接sql語句 $updateSql = "UPDATE " . $tableName . " SET "; $sets = []; $bindings = []; foreach ($updateColumn as $uColumn) { $setSql = "`" . $uColumn . "` = CASE "; foreach ($multipleData as $data) { $setSql .= "WHEN `" . $referenceColumn . "` = ? THEN ? "; $bindings[] = $data[$referenceColumn]; $bindings[] = $data[$uColumn]; } $setSql .= "ELSE `" . $uColumn . "` END "; $sets[] = $setSql; } $updateSql .= implode(', ', $sets); $whereIn = collect($multipleData)->pluck($referenceColumn)->values()->all(); $bindings = array_merge($bindings, $whereIn); $whereIn = rtrim(str_repeat('?,', count($whereIn)), ','); $updateSql = rtrim($updateSql, ", ") . " WHERE `" . $referenceColumn . "` IN (" . $whereIn . ")"; Log::info($updateSql); // 傳入預(yù)處理sql語句和對應(yīng)綁定數(shù)據(jù) return DB::update($updateSql, $bindings); } catch (\Exception $e) { return false; } }
在service層拼接需要更新的數(shù)據(jù),并調(diào)用該函數(shù):
foreach ($taskInfo as $info) { $cityId = $info['requirement']['city_ids']; //此處省略n行代碼 $cityInfo = ['id' => $dataId[$info['id']]['id'], 'city_id' => $cityId]; if ($cityInfo) { $cityInfos[] = $cityInfo; } } $res = $this->waybillDriverInfoModel->updateBatch($cityInfos); }
拼接的批量更新的數(shù)組格式為:
$students = [
[‘id' => 1, ‘city_id' => ‘100010'],
[‘id' => 2, ‘city_id' => ‘100011'],
];
生成的SQL語句如下:
UPDATE base_info SET `city_id` = CASE WHEN `id` = 1 THEN 100010 WHEN `id` = 2 THEN 100011 ELSE `city_id` END WHERE `id` IN (1,2)
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,的支持。
當(dāng)前題目:使用Laravel怎么批量更新多條數(shù)據(jù)-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://jinyejixie.com/article34/cchope.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、品牌網(wǎng)站制作、網(wǎng)站維護(hù)、網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容