Rumah > rangka kerja php > Laravel > Bagaimana untuk mengemas kini berbilang rekod dalam laravel (menghalang suntikan SQL)

Bagaimana untuk mengemas kini berbilang rekod dalam laravel (menghalang suntikan SQL)

藏色散人
Lepaskan: 2021-08-25 09:02:17
ke hadapan
3356 orang telah melayarinya

Lajur tutorial Laravel berikut akan memperkenalkan kepada anda cara mengemas kini berbilang rekod dalam laravel, yang boleh menghalang suntikan SQL saya harap ia akan membantu rakan yang memerlukan!

Ditulis di hadapan

Semua orang yang biasa dengan laravel tahu bahawa laravel mempunyai Berbilang rekod dimasukkan dalam kelompok pada satu masa, tetapi berbilang rekod tidak dikemas kini secara bersyarat pada satu masa.

Adakah anda iri hati dengan update_batch thinkphp saveAll dan ci, tetapi mengapa laravel yang elegan itu tidak mempunyai kaedah kemas kini kelompok yang serupa?

Pakar meng-Google orang itu

dan mendapati seseorang telah menulis pada stackoverflow (https://stackoverflow.com/questions/26133977/laravel-bulk-update) Baiklah, tetapi ia tidak menghalang suntikan sql.

Artikel ini telah dilaraskan bersama dengan laravel's Eloquent untuk mencegah suntikan sql dengan berkesan.

<?php
namespace App\Models;

use DB;
use Illuminate\Database\Eloquent\Model;

/**
 * 学生表模型
 */
class Students extends Model
{
    protected $table = &#39;students&#39;;

    //批量更新
    public function updateBatch($multipleData = [])
    {
        try {
            if (empty($multipleData)) {
                throw new \Exception("数据不能为空");
            }
            $tableName = DB::getTablePrefix() . $this->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;
        }
    }
}
Salin selepas log masuk

boleh dilaraskan mengikut keperluan anda sendiri Berikut adalah contoh penggunaan:

// 要批量更新的数组
$students = [
    ['id' => 1, 'name' => '张三', 'email' => 'zhansan@qq.com'],
    ['id' => 2, 'name' => '李四', 'email' => 'lisi@qq.com'],
];

// 批量更新
app(Students::class)->updateBatch($students);
Salin selepas log masuk

Pernyataan SQL yang dihasilkan adalah seperti berikut:

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)
Salin selepas log masuk
Adakah ia cekap? Ia telah banyak bertambah baik~

Cadangan berkaitan:

Lima tutorial video Laravel terbaharu

Atas ialah kandungan terperinci Bagaimana untuk mengemas kini berbilang rekod dalam laravel (menghalang suntikan SQL). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:segmentfault.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan