Вместо того, чтобы описывать, что такое прицел, потому что уже есть много статей и видеороликов, объясняющих «Что такое прицелы!» . Вместо этого я покажу вам,
насколько мощной является область видимости и как с ее помощью можно сэкономить время .
Короче говоря, области действия предназначены не только для запроса статуса «активно» или «завершено» и т. д.
, но сегодня я покажу вам, что они на самом деле могут делать.
Давайте возьмем пример, предположим, что мы создаем фильтр, который сортирует продукты по порядку от низкого к высокому, от высокого к низкому и т. д. базовый фильтр!,
теперь, если мы хотим применить эту логику, мы сделаем это так: этот :
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 строки, и теперь вы можете использовать его где угодно и где угодно
и вы также можете объединять столько областей, сколько хотите!