"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Laravel 모델에서 Eager 로드 관계 제한

Laravel 모델에서 Eager 로드 관계 제한

2024-11-07에 게시됨
검색:987

Limit Eager Loaded Relationships on Laravel Models

소개

때때로 Laravel 모델에서 관계를 로드하고 싶을 때 반환되는 관련 모델의 수를 제한하고 싶을 수도 있습니다.

예를 들어 블로그 플랫폼에서는 시스템의 모든 작성자와 게시물 3개를 로드하려고 할 수 있습니다.

Laravel의 이전 버전에서는 Eager 로드 관계를 제한하는 것이 약간 까다로운 작업이었습니다. 나는 옳다고 느껴지는 우아한 방법을 결코 찾을 수 없었습니다. 그래서 저는 보통 이 기능을 추가하는 Jonas Staudenmeir(@staudenmeir)의 staudenmeir/eloquent-eager-limit 패키지를 설치했습니다.

그러나 올해 초 해당 패키지의 핵심 기능이 Laravel 프레임워크 자체에 병합되었습니다. 따라서 이는 Laravel 11에서 추가 패키지를 설치할 필요 없이 즉시 로드되는 관계를 제한할 수 있음을 의미합니다.

예를 살펴보겠습니다.

Laravel에서 Eager 로드 관계 제한하기

블로깅 플랫폼이 있고 시스템의 모든 작성자와 게시물 3개를 로드하려고 한다고 가정해 보겠습니다.

Eager 로딩 쿼리에서 Limit 메소드를 사용하여 이를 달성할 수 있습니다:

use App\Models\Post;
use App\Models\Author;
use Illuminate\Contracts\Database\Eloquent\Builder;

$authors = Author::query()
    ->with([
        'posts' => fn (Builder $query): Builder => $query->limit(3),
    ])
    ->get();

위의 코드 예제에서 볼 수 있듯이 App\Models\Author 모델에서 게시물 관계를 즉시 로드하려고 정의했습니다. 즉시 로드 쿼리에서는 세 개의 게시물만 로드하도록 지정하기 위해 제한 메서드를 사용했습니다.

기본 SQL 쿼리

관심 있는 분들을 위해 위의 쿼리는 두 개의 SQL 쿼리를 생성합니다.

첫 번째 쿼리는 데이터베이스에서 작성자를 가져옵니다.

SELECT * FROM `authors`

두 번째 쿼리는 각 작성자에 대해 3개의 게시물을 가져옵니다(시스템에 작성자가 5명이라고 가정).

SELECT *
FROM
    (
        SELECT
            *,
            row_number() OVER (PARTITION BY `posts`.`author_id`) AS `laravel_row`
        FROM `posts`
        WHERE `posts`.`author_id` IN (1, 2, 3, 4, 5)
    ) AS `laravel_table`
WHERE `laravel_row` 



추가 자료

이 게시물을 재미있게 읽으셨다면 비슷한 주제를 더 깊이 있게 다루는 220페이지 분량의 제 전자책 "Battle Ready Laravel"을 확인해 보시는 것도 좋습니다.

또는 Laravel을 사용하여 다른 서비스에서 API를 사용하는 방법을 알려주는 다른 440페이지짜리 전자책 "Laravel에서 API 사용"을 확인해 보세요.

제가 새 게시물을 게시할 때마다 최신 소식을 받고 싶으시면 언제든지 제 뉴스레터에 가입하세요.

계속해서 멋진 것들을 만들어 보세요! ?

릴리스 선언문 이 기사는 https://dev.to/ashallendesign/limit-eager-loaded-relationships-on-laravel-models-4c43?1에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]에 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3