Heim > PHP-Framework > Laravel > So aktualisieren Sie mehrere Datensätze in Laravel stapelweise (SQL-Injection verhindern)

So aktualisieren Sie mehrere Datensätze in Laravel stapelweise (SQL-Injection verhindern)

藏色散人
Freigeben: 2021-08-25 09:02:17
nach vorne
3371 Leute haben es durchsucht

In der folgenden Tutorial-Kolumne von Laravel erfahren Sie, wie Sie mehrere Datensätze in Laravel stapelweise aktualisieren, um SQL-Injection zu verhindern. Ich hoffe, dass es für Freunde in Not hilfreich ist!

Vorab geschrieben: einmal.

Sind Sie neidisch auf saveAll von thinkphp oder update_batch von ci, aber warum verfügt ein so elegantes Laravel nicht über eine ähnliche Batch-Update-Methode?

Experten

Habe es gegoogelt und festgestellt, dass jemand es bereits auf Stackoverflow geschrieben hat (https://stackoverflow.com/questions/26133977/laravel-bulk-update), aber es verhindert nicht die SQL-Injektion.

Dieser Artikel wurde in Verbindung mit Laravel's Eloquent angepasst, um die SQL-Injektion wirksam zu verhindern.

<?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;
        }
    }
}
Nach dem Login kopieren
Sie können es an Ihre eigenen Bedürfnisse anpassen. Das Folgende ist ein Anwendungsbeispiel:

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

// 批量更新
app(Students::class)->updateBatch($students);
Nach dem Login kopieren
Die generierte SQL-Anweisung lautet wie folgt:

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)
Nach dem Login kopieren
Ist die Effizienz erheblich verbessert?

Verwandte Empfehlungen:

Die neueste fünf Laravel-Video-Tutorials

Das obige ist der detaillierte Inhalt vonSo aktualisieren Sie mehrere Datensätze in Laravel stapelweise (SQL-Injection verhindern). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage