N+1問題を解決するためにEagerロードを使用すると思います。
また、行ロックをかけるためにlockForUpdateメソッドを使用すると思います。
Eagerロードと行ロックを一つのクエリで実行できます。
Eagerロードと行ロック
一つのクエリでEagerロードと行ロックを実行するには、クロージャでクエリインスタンスを受け取りlockForUpdate
メソッドを使用します。
$books = App\Book::with(['author' => function($query) {
$query->lockForUpdate();
}])->get();
foreach ($books as $book) {
$book->author;
}
実行されたクエリを見てみましょう。
select * from `books`
select * from authors where id in (1, 2, 3, 4, 5, ...) for update"
Eagerロードされています。
for update
により、しっかり行ロックもされています。
遅延Eagerロードと行ロック
遅延Eagerロードでも同様に、一つのクエリでEagerロードと行ロックを実行する事ができます。
$books = App\Book::all();
$books->load(['author' => function($query) {
$query->lockForUpdate();
}]);
foreach ($books as $book) {
$book->author;
}