@animr

Как правильно построить запрос к БД в Laravel 6 на получение данных с запросами на фильтр и вывести все в пагинацию по полю с отношениями?

Добрый вечер! Помогите разобраться, есть связь

class Category extends Model
{
    protected $fillable = [ 'name', 'code', 'description', 'image' ];

    public function products() {
        return $this->hasMany(Product::class);
    }
}

как мне собрать запрос чтоб в категории с кодом категории отображались только товары с кодом этой категории
public function category(Request $request, $code) {
        //Получаю все товары данной катигории следующим образом: $category->products
        $category = Category::where('code', $code)->first();
        //А пагинация строится в отдельном запросе к таблице Товаров
        $productQuery = Product::query();

        if ($request->filled('price_min')) {
            $productQuery->where('price', '>=', $request->price_min);
        }

        if ($request->filled('price_max')) {
            $productQuery->where('price', '<=', $request->price_max);
        }

        $products = $productQuery->paginate(4);
        return view('category', compact('category', 'products'));
    }

Товары на вьюшку передаю из $category->products. Как к этой коллекции повесить запрос на фильтры и пагинацию?
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
iMedved2009
@iMedved2009
Не люблю людей
public function category(Request $request, $code) {
        //Получаю все товары данной катигории следующим образом: $category->products
        $category = Category::where('code', $code)->firstOrFail();
        //А пагинация строится в отдельном запросе к таблице Товаров
        $products = $category->products()
         ->when(($request->get('price_min'), function(Builder $query, $price_min){
            return $query->where('price', '>=', $price_min);
        })->when(($request->get('price_max'), function(Builder $query, $price_max){
            return $query->where('price', '<=', $price_max);
        })->paginate(4);

        return view('category', compact('category', 'products'));
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы