Laravel의 N+1 문제

2585 단어 PHP라라벨laravel5
중첩 된 관계의 N + 1 문제를 피하고 싶기 때문에 조사했습니다.

Laravel : 5.6.26

예로서 ER과 Laravel 코드



UserController.php public function index() { $users = User::limit(5)->get(); return view('user.index')->with('users', $users); } index.blade.php @foreach ($users as $user) <p>{{$user->name}}</p> <ul> @foreach ($user->posts as $post) <li>{{$post->title}}</li> <li>댓글 수:{{ count($post->comments) }}</li> @endforeach </ul> @endforeach 그 결과 다음과 같은 select 문이 발행됩니다. select * from users limit 5 select * from posts where posts.user_id = 1 select * from comments where comments.post_id = 10 select * from posts where posts.user_id = 2 select * from comments where comments.post_id = 20 select * from posts where posts.user_id = 3 select * from comments where comments.post_id = 30 select * from posts where posts.user_id = 4 select * from comments where comments.post_id = 40 select * from posts where posts.user_id = 5 select * from comments where comments.post_id = 50 N+1 문제를 피하기 위해 with 사용 UserController.php public function index() { $users = User::with('posts')->limit(5)->get(); return view('user.index')->with('users', $users); } select * from users limit 5 select * from posts where posts.user_id in (1, 2, 3, 4, 5) select * from comments where comments.post_id = 10 select * from comments where comments.post_id = 20 select * from comments where comments.post_id = 30 select * from comments where comments.post_id = 40 select * from comments where comments.post_id = 50 posts는 피했지만 comments는 여전히 with로 점 지정 UserController.php public function index() { $users = User::with('posts.comments')->limit(5)->get(); return view('user.index')->with('users', $users); } select * from users limit 5 select * from posts where posts.user_id in (1, 2, 3, 4, 5) select * from comments where comments.post_id in (10, 20, 30, 40, 50) 중첩된 관계 대상의 comments까지 대응할 수 있다 Rails의 bullet 같은 녀석이 Laravel에 있으면 좋지만 없는 것 같다. ※제품의 코드로 시험했기 때문에 상기 코드는 기사 작성시에 손으로 일으키고 있습니다. 복사해도 움직이지 않을 수도 있습니다. 추가 N+1이 발생했는지, 발견할 수 있는 Laravel N+1 Query Detector라는 라이브러리가 있었던 것 같습니다 Laravel에서 N+1 감지

좋은 웹페이지 즐겨찾기