본문 바로가기

Laravel

laravel with() vs load()

with() : 호출될 때 한번에 연관된 모델들을 가져온다. eager loading. 2개의 쿼리만 날린다.  N+1 쿼리 문제를 해결해준다.

 

N+1 쿼리 문제?

1:N인 관계에서 1인 모델을 조회한 뒤 연관된 N개의 모델을 가져오려면 1+N개의 쿼리가 DB에 요청되는 문제.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    /**
     * Get the author that wrote the book.
     */
    public function author()
    {
        return $this->belongsTo('App\Author');
    }
}
// Book 테이블에서 모든 book을 가져와 $books에 할당. book에 연관된 author는 가져오지 않은 상황.
$books = App\Book::all();

// 각각의 책에 대해 DB에 접근해서 N개의 author의 name을 가져옴.
// 즉, 1개의 책에 대해 N개의 query가 발생. 1+N.
foreach ($books as $book) {
    echo $book->author->name;
}

with()를 사용하면 1쪽의 모델을 가져올 때 연관된 N개의 모델을 한번에 가져오므로 2번의 쿼리만으로 관련된 정보를 조회할 수 있다.

// Book 테이블에서 book 정보를 가져올 때 연관된 author도 함께 가져옴.
$books = App\Book::with('author')->get();

// $book에 이미 author 모델이 딸려서 오기 때문에 query를 안날리고 바로 접근 가능.
foreach ($books as $book) {
    echo $book->author->name;
}
// Book 테이블에서 모든 정보 조회
select * from books

// Author 테이블에서 book_id foreign key로 전부 조회.
select * from authors where book_id in (1, 2, 3, 4, 5, ...)

 

load() : 필요할 때 특정 모델에 연관된 모델들을 가져온다. lazy eager loading. 모델을 동적으로 결정해야 할 때 사용. 당장 연관된 모든 모델을 가져오고 싶지 않고, 나중에 필요한 애들만 골라서 연관 모델들을 가져오고 싶은 경우에 사용.

$books = App\Book::all();

// 특정 조건에 해당하는 경우에만 books 모델들에 연관된 author, publisher들을 로딩한다.
if ($someCondition) {
    $books->load('author', 'publisher');
}

 

'Laravel' 카테고리의 다른 글

Remove Laravel bootstrap cache config.php uploaded to AWS  (0) 2020.02.29
Laravel Responder  (0) 2020.02.22
Laravel env() vs PHP getenv()  (0) 2020.02.21
Laravel optional helper 라라벨  (0) 2020.02.21
PhpStorm 공식 홈페이지 단축키 모음  (0) 2020.01.25