day15の今日は複数データ(大量データ)をまとめて削除する方法を見ていきます。
Doctrine
<?php
declare(strict_types=1);
use App\Entity\Author;
use App\Entity\Book;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query\ResultSetMapping;
require __DIR__.'/../vendor/autoload.php';
/** @var EntityManagerInterface $entityManager */
$entityManager = require __DIR__.'/bootstrap.php';
// エンティティを使ってやる
foreach ($entityManager->getRepository(Book::class)->findAll() as $book) {
$entityManager->remove($book);
}
$entityManager->flush(); // begin + 全件のdelete + commitがここで行われる
// エンティティを使えないぐらい多い件数を扱う場合
$conn = $entityManager->getConnection();
$conn->beginTransaction();
for ($i = 1; $i <= 1000000; $i++) {
$conn->delete('books', ['id' => $i]);
}
$conn->commit();
- エンティティのインスタンスを作ることを許容できる場合、通常のEntityManagerを使った削除で十分です。DELETE文はEntityManager::flush()を呼んだときにトランザクション付きでまとめて実行されます。
- エンティティのインスタンスを作ることが許容できないぐらい大量のバッチ削除を行いたい場合はDBALのConnectionに対する
delete()
メソッドで実行することもできます。
Eloquent
<?php
declare(strict_types=1);
use App\Models\Book;
use Illuminate\Support\Facades\DB;
require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/bootstrap.php';
DB::beginTransaction();
for ($i = 1; $i <= 100000; $i++) {
DB::delete('DELETE FROM books WHERE id = ?', [$i]);
}
DB::commit();
- insert, updateと同様、モデルに対してバッチ削除をするにはサードパーティのプラグインパッケージが必要です。