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