12장 즉시 로드와 페이징

12.1. 즉시 로드

// 코드 12-1 app/Http/routes.php

Route::resource('articles', 'ArticlesController');
// 코드 12-2 app/Http/Controllers/ArticlesController.php

class ArticlesController extends Controller
{
    public function index()
    {
        $articles = \App\Article::get();

        return view('articles.index', compact('articles'));
    }
}
<!-- // 코드 12-3 resources/views/articles/index.blade.php -->

@extends('layouts.app')

@section('content')
  <div class="container">
    <h1>포럼 글 목록</h1>
    <hr/>
    <ul>
      @forelse($articles as $article)
        <li>
          {{ $article->title }}
          <small>
            by {{ $article->user->name }}
          </small>
        </li>
      @empty
        <p>글이 없습니다.</p>
      @endforelse
    </ul>
  </div>
@stop

12.1.1. N+1 쿼리 문제

// 코드 12-4 app/Http/routes.php

DB::listen(function ($query){
    var_dump($query->sql);
});

그림 12-1 N+1 문제점

12.1.2. 해결 방법

// 코드 12-5 app/Http/Controllers/ArticlesController.php

$articles = \App\Article::with('user')->get();

12.1.3. 지연 로드

// 코드 12-6 app/Http/Controllers/ArticlesController.php

$articles = \App\Article::get();

// user() 관계가 필요 없는 다른 로직 수행

$articles->load('user');

return view('articles.index', compact('articles'));

12.2. 페이징

12.2.1. 페이지네이터

// 코드 12-7 app/Http/Controllers/ArticlesController.php

$articles = \App\Article::latest()->paginate(3);

return view('articles.index', compact('articles'));
<!-- // 코드 12-8 resources/views/articles/index.blade.php -->

@extends('layouts.app')

@section('content')
  <div><!-- //... --></div>

  @if($articles->count())
    <div class="text-center">
      {!! $articles->render() !!}
    </div>
  @endif
@stop

그림 12-2 트위터 부트스트랩이 적용된 페이지네이터

12.3. 마치며

$ git commit -m '즉시 로드와 페이징'
$ git tag 1012-eagerloading-pagination

results matching ""

    No results matching ""