laravel實(shí)現(xiàn)批量更新多條記錄的方法示例
前言
相信熟悉laravel的童鞋都知道,laravel有批量一次性插入多條記錄,卻沒有一次性按條件更新多條記錄。
是否羨慕thinkphp的saveAll,是否羨慕ci的update_batch,但如此優(yōu)雅的laravel怎么就沒有類似的批量更新的方法呢?
高手在民間
Google了一下,發(fā)現(xiàn)stackoverflow( https://stackoverflow.com/questions/26133977/laravel-bulk-update )上已經(jīng)有人寫好了,但是并不能防止sql注入。
本篇文章,結(jié)合laravel的Eloquent做了調(diào)整,可有效防止sql注入。
示例代碼
<?php
namespace App\Models;
use DB;
use Illuminate\Database\Eloquent\Model;
/**
* 學(xué)生表模型
*/
class Students extends Model
{
protected $table = 'students';
//批量更新
public function updateBatch($multipleData = [])
{
try {
if (empty($multipleData)) {
throw new \Exception("數(shù)據(jù)不能為空");
}
$tableName = DB::getTablePrefix() . $this->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語句和對(duì)應(yīng)綁定數(shù)據(jù)
return DB::update($updateSql, $bindings);
} catch (\Exception $e) {
return false;
}
}
}
可以根據(jù)自己的需求再做調(diào)整,下面是用法實(shí)例:
// 要批量更新的數(shù)組 $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)
是不是效率又提高了一大截呢~
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
laravel郵件發(fā)送的實(shí)現(xiàn)代碼示例
這篇文章主要介紹了laravel郵件發(fā)送的實(shí)現(xiàn)代碼示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
php設(shè)計(jì)模式之觀察者模式實(shí)例詳解【星際爭霸游戲案例】
這篇文章主要介紹了php設(shè)計(jì)模式之觀察者模式,結(jié)合星際爭霸游戲案例形式分析了php觀察者模式相關(guān)概念、原理、用法與操作注意事項(xiàng),需要的朋友可以參考下2020-03-03
PHP實(shí)現(xiàn)把文本中的URL轉(zhuǎn)換為鏈接的auolink()函數(shù)分享
這篇文章主要介紹了PHP實(shí)現(xiàn)把文本中的URL轉(zhuǎn)換為鏈接的auolink()函數(shù)分享,非常簡潔易用的一個(gè)函數(shù),原作者還有另外一些很Nice的PHP函數(shù),需要的朋友可以參考下2014-07-07
PHP中set error handler函數(shù)用法小結(jié)
set_error_handler() 函數(shù)設(shè)置用戶自定義的錯(cuò)誤處理函數(shù)。該函數(shù)用于創(chuàng)建運(yùn)行時(shí)期間的用戶自己的錯(cuò)誤處理方法。該函數(shù)會(huì)返回舊的錯(cuò)誤處理程序,若失敗,則返回 null2015-11-11
PHP常用算法和數(shù)據(jù)結(jié)構(gòu)示例(必看篇)
下面小編就為大家?guī)硪黄狿HP常用算法和數(shù)據(jù)結(jié)構(gòu)示例(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
純php打造的tab選項(xiàng)卡效果代碼(不用js)
用php實(shí)現(xiàn)的tab選項(xiàng)卡效果,根據(jù)get判斷,獲取get生成css與對(duì)應(yīng)的內(nèi)容,當(dāng)然效率肯定沒有靜態(tài)的好,這里給出的思路與方法。2010-12-12
phalcon model在插入或更新時(shí)會(huì)自動(dòng)驗(yàn)證非空字段的解決辦法
這篇文章主要介紹了phalcon model在插入或更新時(shí)會(huì)自動(dòng)驗(yàn)證非空字段的解決辦法,需要的朋友可以參考下2016-12-12

