Laravel로 부담없이 대량 업데이트하고 싶습니다.

벌크 업데이트란?



일괄 처리 등에서는, 데이터베이스에 복수의 행을 삽입하거나, 갱신하고 싶은 경우가 자주 있다고 생각합니다. 삽입에 관해서는, 대부분의 RDBMS에서는 INSERT INTO table (...) VALUES (...), (...) 와 같은 형태로 간단하게 실행 가능하고, Laravel에서도 insert() 의 제1 인수에 연상 배열의 배열을 건네주면 가능합니다.

갱신에 관해서는 그렇게 간단하지는 않습니다만, MySQL에 한해서는 ELT()FIELD() 라고 하는 2개의 함수를 사용한 방법으로 가능합니다. 그러나 이것을 Laravel에서 실행하는 것은 상당히 까다롭기 때문에 쉽게 실행할 수 있도록 해 보았습니다.

사용법



상기에 있는 서비스 프로바이더 클래스의 파일을, app/Providers 이하에 배치해, config/app.phpprovidersApp\Providers\MySqlBulkUpdateServiceProvider::class
<?php

DB::table('users')->whereNull('email_verified_at')->updateBulk([
    ['id' => 1, 'name' => 'admin1', 'email' => '[email protected]'],
    ['id' => 2, 'name' => 'admin2', 'email' => '[email protected]'],
    ['id' => 3, 'name' => 'admin3', 'email' => '[email protected]'],
]);

또는,
<?php

App\Models\User::whereNull('email_verified_at')->updateBulk([
    ['id' => 1, 'name' => 'admin1', 'email' => '[email protected]'],
    ['id' => 2, 'name' => 'admin2', 'email' => '[email protected]'],
    ['id' => 3, 'name' => 'admin3', 'email' => '[email protected]'],
]);

처럼 실행합니다.

상세



제 1 인수로 건네준 배열로부터 id 위의 Eloquent\Builder 예제의 경우 다음과 같은 SQL로 컴파일됩니다.
UPDATE
    `users`
SET
    `name` = ELT(FIELD(`id`, ?, ?, ?), ?, ?, ?),
    `email` = ?
WHERE
    `email_verified_at` IS NULL
    AND `id` IN (?, ?, ?)
Query\Builder 는 모든 행에서 동일하므로 email , ELT() 는 사용하지 않는 형태로 합니다. 또한 FIELD() 이전에 추가한 WHERE 절도 별도로 설정됩니다.

또한, updateBulk() 경유의 경우는 Eloquent\Builder 등도 자동으로 설정됩니다.
updated_at 경유의 실행시, 프라이머리 키가 Query\Builder 이외의 경우, 혹은 id 로, 프라이머리 키 이외로 검색하고 싶은 경우는, 제 2 인수에 컬럼명을 지정합니다.
DB::table('users')->updateBulk([
    ['name' => 'admin1', 'email' => '[email protected]'],
    ['name' => 'admin2', 'email' => '[email protected]'],
    ['name' => 'admin3', 'email' => '[email protected]'],
], 'email');

이 기사의 라이센스




이 문서는 CC BY (크리에이티브 커먼즈 표시 4.0 국제 라이센스)에 게시됩니다.

좋은 웹페이지 즐겨찾기