Laravel 쿼리 범위의 마법
6459 단어 phpeloquentqueryscopeslaravel
// A simple select
Book::limit(5)->get();
이제 품질이 낮은 책 제안이나 영원히 숨겨져 있는 것이 더 나은 지식이 있는 호크룩스 책을 선택했을 수 있습니다. 귀하는 홈페이지에 게시하기 위해 도서 제안이
// 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)
}
범위를 사용하는 것이 항상 유용한 것은 아니지만 쿼리에서 더 작고 재사용 가능한 블록이 필요하다고 느끼거나 가독성에 어려움을 겪을 때 범위가 특히 유용하다는 것을 알게 되었습니다.
이전에 쿼리 범위를 사용하지 않았다면 무언가를 배웠기를 바랍니다.
(더 복잡한) 쿼리와 어떻게 씨름했습니까?
다음에 대해 의견을 남겨주세요.
// 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 버전이 여전히 최신 버전인지 확인)
후속 기사:
Reference
이 문제에 관하여(Laravel 쿼리 범위의 마법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bertheyman/the-magic-of-query-scopes-in-laravel-pfp텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)