Laravel 쿼리 범위의 마법

사람들이 다른 사람들을 위해 추천 도서를 입력할 수 있는 사이트를 구축하고 있다고 가정해 보겠습니다. 티저로 홈페이지에는 5권의 도서 제안이 포함됩니다. 쿼리는 다음과 같이 간단할 수 있습니다.

// A simple select
Book::limit(5)->get();


이제 품질이 낮은 책 제안이나 영원히 숨겨져 있는 것이 더 나은 지식이 있는 호크룩스 책을 선택했을 수 있습니다. 귀하는 홈페이지에 게시하기 위해 도서 제안이
  • 표시되도록 설정
  • 지난달에 생성됨
  • 최소 10개의 찬성 투표

  • // Some quality control
    Book::where('visible', 1)
        ->where('created_at', '>', Carbon::now()->subMonth())
        ->whereHas('votes', '>=', 10)
        ->limit(5)
        ->get();
    


    이것은 당신에게 완벽한 책 제안을 제공하므로 당신은 만족하고 그들 중 일부를 읽을 시간을 할애하십시오. 그러나 잠시 후 제안의 품질을 개선하기 위해 훨씬 더 많은 확인이 필요하게 됩니다. 이로 인해 쿼리가 다소 복잡해지거나 읽기 어려워질 수 있습니다.

    이 시점에서 쿼리 범위를 사용하여 쿼리를 내뱉는 것을 고려할 수 있습니다. 쿼리를 빌딩 블록으로 나누면 읽고 재사용하기가 더 쉬워집니다.

    쿼리 범위가 있는 리팩터링



    Laravel의 쿼리 범위를 사용하여 다음 리팩터링을 살펴보십시오.

    // App\Http\Controllers\BookController.php
    
    // This syntax is very readable and easy to reuse
    // Every building block is defined on your model
    Book::popular()
        ->createdAfter(Carbon::now()->subMonth())
        ->limit(5)
        ->get();
    
    // App\Book.php (model)
    
    protected static function boot()
    {
        parent::boot();
    
        // A global scope is applied to all queries on this model
        // -> No need to specify visibility restraints on every query
        static::addGlobalScope('visible', function (Builder $builder) {
            $builder->where('visible', 1);
        });
        // Bonus: if multiple models are hideable, this behaviour might
        // belong in a specific scope for easy reuse
    }
    
    // These are local scopes: ->popular() is added to the query to apply this where statement
    public function scopePopular($query)
    {
        // By defining the conditions to be a popular book,
        // it's easy to change them later on for all queries at once
        return $query->whereHas('votes', '>=', 10);
    }
    
    public function scopeCreatedAfter($query, $date)
    {
        // A scope can be dynamic and accept parameters
        return $query->where('created_at', '>', $date)
    }
    
    


    범위를 사용하는 것이 항상 유용한 것은 아니지만 쿼리에서 더 작고 재사용 가능한 블록이 필요하다고 느끼거나 가독성에 어려움을 겪을 때 범위가 특히 유용하다는 것을 알게 되었습니다.

    이전에 쿼리 범위를 사용하지 않았다면 무언가를 배웠기를 바랍니다.

    (더 복잡한) 쿼리와 어떻게 씨름했습니까?
    다음에 대해 의견을 남겨주세요.
  • 이 기사에 빠진 초보자를 위한 유용한 팁이 있습니까?
  • 예제와 쿼리에서 다르게 수행할 작업은 무엇입니까?
  • 대규모 프로젝트에서 쿼리를 구성하는 데 사용하는 패턴입니다. 리포지토리, 쿼리 범위, 혼합 또는 완전히 다른 것?

  • 추가 정보: Laravel docs on query scopes (Laravel 버전이 여전히 최신 버전인지 확인)
    후속 기사:

    좋은 웹페이지 즐겨찾기