LoginSignup
0
0

More than 1 year has passed since last update.

【Laravel】一つのクエリでEagerロードと行ロックを実行したい

Last updated at Posted at 2021-09-21

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;
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0