摘要:寫在前面熟悉的童鞋都知道,有批量一次性插入多條記錄,卻沒有一次性按條件更新多條記錄。本篇文章,結合的做了調整,可有效防止注入。
寫在前面
熟悉laravel的童鞋都知道,laravel有批量一次性插入多條記錄,卻沒有一次性按條件更新多條記錄。
是否羨慕thinkphp的saveAll,是否羨慕ci的update_batch,但如此優雅的laravel怎么就沒有類似的批量更新的方法呢?
高手在民間Google了一下,發現stackoverflow( https://stackoverflow.com/que... )上已經有人寫好了,但是并不能防止sql注入。
本篇文章,結合laravel的Eloquent做了調整,可有效防止sql注入。
getTable(); // 表名 $firstRow = current($multipleData); $updateColumn = array_keys($firstRow); // 默認以id為條件更新,如果沒有ID則以第一個字段為條件 $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 . ")"; // 傳入預處理sql語句和對應綁定數據 return DB::update($updateSql, $bindings); } catch (Exception $e) { return false; } } }
可以根據自己的需求再做調整,下面是用法實例:
// 要批量更新的數組 $students = [ ["id" => 1, "name" => "張三", "email" => "zhansan@qq.com"], ["id" => 2, "name" => "李四", "email" => "lisi@qq.com"], ]; // 批量更新 app(Students::class)->updateBatch($students);
生成的SQL語句如下:
UPDATE pre_students SET NAME = CASE WHEN id = 1 THEN "張三" WHEN id = 2 THEN "李四" ELSE NAME END, email = CASE WHEN id = 1 THEN "zhansan@qq.com" WHEN id = 2 THEN "lisi@qq.com" ELSE email END WHERE id IN (1, 2)
是不是效率又提高了一大截呢~
原文 http://www.tech1024.cn/origin...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30626.html
摘要:使用執行單元測試查詢獲取連接對象根據連接對象,得到執行語句,返回遍歷結果集查詢獲取連接對象根據連接對象,得到執行添加影響的行數,,如果大于表明操作成功。否則失敗更新成功更新失敗光標選中方法名字,然后右鍵執行單元測試。 文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關注我的微信公眾號:好好學java,獲取優質學習資源。 一、JDBC JAVA Database Connectivi...
摘要:和很像,嚴格來說,應該是模仿了是設計。程序中使用該類的主要功能是獲取對象,該類包含如下方法該方法獲得對應數據庫的連接代表數據庫連接對象,每個代表一個物理連接會話。當執行查詢時,返回查詢到的結果集。程序可以通過操作該對象來取出查詢結果。 JDBC基礎 JDBC的全稱是Java Database Connectivity,即Java數據庫連接,它是一種可以執行SQL語句的Java API。...
摘要:原生語句使用原生語句查詢請先引入查詢語句語句執行成功返回插入語句語句執行成功返回修改語句語句返回受影響行數刪除語句語句返回刪除行數注建議語句中的變量請盡量使用占位,然后在執行時使用數組的方式替換,有助于防止注入攻擊。 原生SQL語句 使用原生sql語句查詢請先引入 use IlluminateSupportFacadesDB; 查詢語句 // sql 語句 $sql = SELECT ...
摘要:文章來源框架的數據庫操作由包提供支持,包經過非常精心優雅的設計,提供了非常強大的配置管理方法操作鏈式操作事務操作等功能。其他鏈式操作請參考上述鏈式操作章節。 文章來源:http://gf.johng.cn/494380 gf框架的數據庫ORM操作由gdb包提供支持,gdb包經過非常精心優雅的設計,提供了非常強大的配置管理、方法操作、鏈式操作、事務操作等功能。gdb包具體API說明文檔詳...
閱讀 1581·2021-09-24 10:38
閱讀 1516·2021-09-22 15:15
閱讀 3063·2021-09-09 09:33
閱讀 908·2019-08-30 11:08
閱讀 644·2019-08-30 10:52
閱讀 1257·2019-08-30 10:52
閱讀 2350·2019-08-28 18:01
閱讀 527·2019-08-28 17:55