Laravel로 부담없이 대량 업데이트하고 싶습니다.
벌크 업데이트란?
일괄 처리 등에서는, 데이터베이스에 복수의 행을 삽입하거나, 갱신하고 싶은 경우가 자주 있다고 생각합니다. 삽입에 관해서는, 대부분의 RDBMS에서는 INSERT INTO table (...) VALUES (...), (...)
와 같은 형태로 간단하게 실행 가능하고, Laravel에서도 insert()
의 제1 인수에 연상 배열의 배열을 건네주면 가능합니다.
갱신에 관해서는 그렇게 간단하지는 않습니다만, MySQL에 한해서는 ELT()
와 FIELD()
라고 하는 2개의 함수를 사용한 방법으로 가능합니다. 그러나 이것을 Laravel에서 실행하는 것은 상당히 까다롭기 때문에 쉽게 실행할 수 있도록 해 보았습니다.
사용법
상기에 있는 서비스 프로바이더 클래스의 파일을, app/Providers
이하에 배치해, config/app.php
의 providers
에 App\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 국제 라이센스)에 게시됩니다.
Reference
이 문제에 관하여(Laravel로 부담없이 대량 업데이트하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/HAYASHI-Masayuki/items/eec7e85eb8835ee8c96f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
상기에 있는 서비스 프로바이더 클래스의 파일을,
app/Providers
이하에 배치해, config/app.php
의 providers
에 App\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 국제 라이센스)에 게시됩니다.
Reference
이 문제에 관하여(Laravel로 부담없이 대량 업데이트하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/HAYASHI-Masayuki/items/eec7e85eb8835ee8c96f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Laravel로 부담없이 대량 업데이트하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/HAYASHI-Masayuki/items/eec7e85eb8835ee8c96f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)