Вместо того, чтобы описывать, что такое прицел, потому что уже есть много статей и видеороликов, объясняющих «Что такое прицелы!» . Вместо этого я покажу вам,
насколько мощной является область видимости и как с ее помощью можно сэкономить время .

Короче говоря, области действия предназначены не только для запроса статуса «активно» или «завершено» и т. д.
, но сегодня я покажу вам, что они на самом деле могут делать.

Давайте возьмем пример, предположим, что мы создаем фильтр, который сортирует продукты по порядку от низкого к высокому, от высокого к низкому и т. д. базовый фильтр!,
теперь, если мы хотим применить эту логику, мы сделаем это так: этот :

php

public $sortBy = "";

switch($this->sortBy){
 
 case 'low-to-heigh':
    Product::orderBy('sale_price', 'asc')->get();
case 'heigh-to-low':
    Product::orderBy('sale_price', 'desc')->get();
case 'featured':
    Product::where('featured',-1)->get();
default:
    Product::all();
}

Предположим, мы хотим добавить больше фильтров, например, фильтровать по категориям, чтобы мы могли добавить

категория такая:

switch($this->sortBy){
 
  case 'low-to-heigh':
      Product::where('category_id',$categoryId)->orderBy('sale_price', 'asc')->get();
  
  case 'heigh-to-low':
      Product::where('category_id',$categoryId)->orderBy('sale_price', 'desc')->get();
  
  case 'featured':
      Product::where('category_id',$categoryId)->where('featured',-1)->get();
  
  default:
      Product::all();
}

Теперь, если вы заметили, мы добавили запрос категории в каждое условие, так что это противоречит принципам D.R.Y. Теперь здесь вступают в действие области видимости, а также это может быть 1-строчный лайнер, да, вы слышали, что это может быть 1-строчный лайнер, давайте посмотрим…

Прежде всего, мы определим область с именем SortBy:
и добавим дополнительный параметр с именем $sortBy, который будет динамическим, и мы скопируем код фильтра в область.

public function scopeSortBy($query,$sortBy)
{
    switch($sortBy){
     
     case 'low-to-heigh':
        $query->orderBy('sale_price', 'asc')->get();
     case 'heigh-to-low':
        $query->orderBy('sale_price', 'desc')->get();
    case 'featured':
        $query->where('featured',-1)->get();
    default:
        Product::all();
    }
}

теперь давайте определим еще одну динамическую область с именем scopeCategoryFilter, и мы добавим запрос категории внутри области.

public function scopeCategoryFilter($query,$category)
{
 $query->where('category_id',$category);
}

теперь давайте объединим эту область в 1 запрос

Product::CategoryFilter($category->id)->SortBy($this->sortBy)->get();

Как видите, мы сократили так много строк кода до 1 строки, и теперь вы можете использовать его где угодно и где угодно
и вы также можете объединять столько областей, сколько хотите!