filled('part') ? $this->filterProductsByPart($request) : $this->filterProducts($request) ); } /** * 过滤商品 * * @param \Illuminate\Http\Request $request * @return \Illuminate\Pagination\Paginator */ protected function filterProducts(Request $request): Paginator { $input = $request->input(); if ($request->isNotFilled('sort')) { $input['sort'] = '-id'; } return ProductSku::select(['id', 'name', 'cover', 'sell_price', 'vip_price', 'sales']) ->filter($input) ->isRelease() ->whereRelation('category', 'is_show', true) ->simplePaginate($this->getPerPage($request)); } /** * 按分区过滤商品 * * @param \Illuminate\Http\Request $request * @return \Illuminate\Pagination\Paginator */ protected function filterProductsByPart(Request $request): Paginator { $productPart = ProductPart::where('key', $request->input('part'))->first(); if ($productPart === null) { return new Paginator([], $this->getPerPage($request), Paginator::resolveCurrentPage()); } $paginator = ProductPartSku::with('sku:id,name,cover,sell_price,vip_price,sales') ->whereHas('sku', function ($query) { $query->isRelease()->whereRelation('category', 'is_show', true); }) ->where('part_id', $productPart->id) ->latest('sort') ->simplePaginate($this->getPerPage($request)); return $paginator->through(function ($item) { return $item->sku; }); } /** * @return int */ protected function getPerPage(Request $request): int { $perPage = (int) $request->input('per_page'); if ($perPage > 0) { return $perPage > 50 ? 50 : $perPage; } return 20; } }