>  기사  >  백엔드 개발  >  Laravel 모델에서 Eager 로드 관계 제한

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

王林
王林원래의
2024-09-09 18:30:15451검색

Limit Eager Loaded Relationships on Laravel Models

소개

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

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

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

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

예시를 살펴보겠습니다.

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

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

Eager 로딩 쿼리의 제한 메소드를 사용하여 이를 달성할 수 있습니다.

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();

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

기본 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` <= 3
ORDER BY `laravel_row`

추가 자료

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

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

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

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

위 내용은 Laravel 모델에서 Eager 로드 관계 제한의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.