Фильтр товаров для разных страниц (Laravel)

325
09 января 2018, 15:23

Есть роуты:

site/catalog/  // catalogController@index
site/catalog/parentCategory/childrenCategory //childrenCategoryController@index
site/catalog/parentCategory //parentCategoryController@index

На странице каталога показываются все товары, на странице категорий все товары, принадлежащие к этим категориям. На каждой странице есть фильтр по товарам, выполненный в виде get запросов, т.е. site/catalog/?price_from=0&price_to=9999&color=red

Фильтр полностью идентичен для каждой страницы. Подскажите, пожалуйста, каким образом лучше все это написать? Копировать код для каждого контроллера - моветон, при небольшом изменении фильтра это нужно будет менять везде, со временем это станет очень сложно поддерживать. Как лучше поступить?

Answer 1

Я фильтр уношу в модель, и контроллер для обработки каталога тоже можно оставить всего один просто направить все, что идет на

Route::get('/catalog/{some_path?}', 'ТвойКласс@МетодОбработки')->where('some_path', '(.*)');

, вот пример, делаешь scopeSearch и в нем расписываешь всю логику фильтрации, у меня пример будет по фильтрации заказов, но это не суть:

Модель Order

/**
     * @param $query
     * @param Request $request
     * @return mixed
     */
    public function scopeSearch($query, Request $request)
    {        
        if ($request->has('product')) {
            $query->leftJoin('products as p','p.id','=','orders.product_id')
                  ->where('p.title','like','%'.$request->get('product').'%');
        }
        if ($request->has('sn')) {
            $query->where('sn','like','%'.$request->get('sn').'%');
        }
        if ($request->has('owner')) {
            $query->leftJoin('users as u','u.id','=','orders.user_id')
                ->where('u.name','like','%'.$request->get('owner').'%');
        }
        if ($request->has('customer_fio')) {
            $query->where('customer_fio','like','%'.$request->get('customer_fio').'%');
        }
        if ($request->has('customer_phone')) {
            $query->where('customer_phone','like','%'.$request->get('customer_phone').'%');
        }
        if ($request->has('oStartDate') && $request->has('oEndDate')) {
            $startDate = Carbon::parse($request->get('oStartDate'));
            $endDate = Carbon::parse($request->get('oEndDate'));
            $query->whereBetween('order_dt', [$startDate->format('Y-m-d 00:00:00'), $endDate->format('Y-m-d 23:59:59')]);
        }
        if ($request->has('cStartDate') && $request->has('cEndDate')) {
            $startDate = Carbon::parse($request->get('cStartDate'));
            $endDate = Carbon::parse($request->get('cEndDate'));
            $query->whereBetween('created_at', [$startDate->format('Y-m-d 00:00:00'), $endDate->format('Y-m-d 23:59:59')]);
        }

        $query->select('orders.*');
        return $query;
    }

И тогда контроллер собственно будет выглядеть так: сперва можно проверить по входящей переменной какой путь и по слугу понять что это (категория или список продуктов) ни и потом там где уже известно что продукты:

$data = Product::where('slug',$slug)->search($request)->orderBy('created_at', 'desc')->paginate(50);
READ ALSO
Переход по страницам без перезагрузки

Переход по страницам без перезагрузки

Здравствуйте, решил сделать на сайте переход по страницам без перезагрузки, сделал через historyreplaceState(null, null, null);

207
Добавление JSON данных в базу MySQL

Добавление JSON данных в базу MySQL

Необходимо распарсить полученный JSON и добавить эти данные в таблицуДобавление будет происходить при двух условиях

205
проблема при авторизации [требует правки]

проблема при авторизации [требует правки]

После авторизацией на сайт при переходе на другую страницу аккаунт меняется, то есть я попал на другой аккаунт, очень странноПомогите пожалуйста...

172
Вывод даты в WordPress

Вывод даты в WordPress

Есть плагин, который выводит дату для событий, нужно как-то поменять окончания месяцев, которые он выводит (не "14 февраль", а "14 февраля")

171