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 |