From c4d73d418500501a4fd45fee7aa7cfa3c11ce412 Mon Sep 17 00:00:00 2001 From: TL Date: Tue, 12 Jul 2022 20:09:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E5=8F=B0=E5=95=86=E5=93=81=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Http/Controllers/ProductController.php | 34 +-------- beike/Repositories/ProductRepo.php | 73 +++++++++++-------- .../Http/Controllers/CategoryController.php | 4 +- .../Shop/Http/Controllers/HomeController.php | 2 +- 4 files changed, 48 insertions(+), 65 deletions(-) diff --git a/beike/Admin/Http/Controllers/ProductController.php b/beike/Admin/Http/Controllers/ProductController.php index 9933dfc4..fcbd5954 100644 --- a/beike/Admin/Http/Controllers/ProductController.php +++ b/beike/Admin/Http/Controllers/ProductController.php @@ -8,6 +8,7 @@ use Beike\Models\Product; use Beike\Models\ProductDescription; use Beike\Models\ProductSku; use Beike\Admin\Services\ProductService; +use Beike\Repositories\ProductRepo; use Illuminate\Http\Request; class ProductController extends Controller @@ -17,38 +18,7 @@ class ProductController extends Controller public function index(Request $request) { if ($request->expectsJson()) { - $query = Product::query() - ->select('products.*') - ->with('description', 'skus'); - - if ($request->sku) { - $query->whereHas('skus', function ($q) { - $q->where('sku', 'like', '%'.request('sku').'%'); - }); - } - - // 关键字搜索:名称 - if ($request->keyword) { - $query->whereHas('description', function ($q) { - $q->where('name', 'like', '%'.request('keyword').'%'); - }); - } - - $query->when($request->active !== null, function ($q) { - $q->where('active', (int)request('active')); - }); - - // 回收站 - if ($request->trashed) { - $query->onlyTrashed(); - } - - // 排序 - $orderBy = $request->order_by ?? 'products.id:desc'; - $orderBy = explode(':', $orderBy); - $query->orderBy($orderBy[0], $orderBy[1] ?? 'desc'); - - $products = $query->paginate($request->per_page ?? 10); + $products = ProductRepo::list($request->all()); return ProductResource::collection($products); } diff --git a/beike/Repositories/ProductRepo.php b/beike/Repositories/ProductRepo.php index d10075ba..94b3b95c 100644 --- a/beike/Repositories/ProductRepo.php +++ b/beike/Repositories/ProductRepo.php @@ -32,50 +32,63 @@ class ProductRepo /** - * 通过多个产品分类获取产品列表 - * - * @param $categoryIds - * @return mixed - */ - public static function getProductsByCategories($categoryIds) - { - $products = self::getProductsByCategory($categoryIds); - $items = $products->groupBy('category_id'); - return $items; - } - - - /** - * 通过单个产品分类获取产品列表 + * 通过单个或多个产品分类获取产品列表 * * @param $categoryId * @return AnonymousResourceCollection */ public static function getProductsByCategory($categoryId): AnonymousResourceCollection { - $builder = self::getProductsBuilder($categoryId); + $builder = self::getBuilder(['category_id' => $categoryId]); $products = $builder->get(); $items = ProductList::collection($products); return $items; } - /** - * 获取 Builder - * @param $categoryId - * @return Builder - */ - public static function getProductsBuilder($categoryId): Builder + public static function getBuilder($data = []) :Builder { - if (is_int($categoryId)) { - $categoryId[] = $categoryId; + $builder = Product::query()->with('description', 'skus', 'master_sku'); + + if (isset($data['category_id'])) { + $builder->whereHas('categories', function ($query) use ($data) { + if (is_array($data['category_id'])) { + $query->whereIn('category_id', $data['category_id']); + } else { + $query->where('category_id', $data['category_id']); + } + }); } - $builder = Product::query() - ->select(['products.*', 'pc.category_id']) - ->with(['description', 'skus', 'master_sku']) - ->join('product_categories as pc', 'products.id', '=', 'pc.product_id') - ->join('categories as c', 'pc.category_id', '=', 'c.id') - ->whereIn('c.id', $categoryId); + if (isset($data['sku']) || isset($data['model'])) { + $builder->whereHas('skus', function ($query) use ($data) { + if (isset($data['sku'])) { + $query->where('sku', 'like', "%{$data['sku']}%"); + } + if (isset($data['model'])) { + $query->where('model', 'like', "%{$data['model']}%"); + } + + }); + } + if (isset($data['model'])) { + $builder->whereHas('skus', function ($query) use ($data) { + $query->where('sku', 'like', "%{$data['sku']}%"); + }); + } + if (isset($data['name'])) { + $builder->whereHas('description', function ($query) use ($data) { + $query->where('name', 'like', "%{$data['name']}%"); + }); + } + if (isset($data['active'])) { + $builder->where('active', (int)$data['active']); + } + return $builder; } + + public static function list($data) + { + return self::getBuilder($data)->paginate($data['per_page'] ?? 20); + } } diff --git a/beike/Shop/Http/Controllers/CategoryController.php b/beike/Shop/Http/Controllers/CategoryController.php index b9b4493a..3bb0bce6 100644 --- a/beike/Shop/Http/Controllers/CategoryController.php +++ b/beike/Shop/Http/Controllers/CategoryController.php @@ -17,11 +17,11 @@ class CategoryController extends Controller public function show(Request $request, Category $category) { - $products = ProductRepo::getProductsBuilder($category)->paginate(); + $products = ProductRepo::getProductsByCategory($category->id); $data = [ 'category' => $category, - 'products' => ProductList::collection($products), + 'products' => $products, ]; return view('category', $data); diff --git a/beike/Shop/Http/Controllers/HomeController.php b/beike/Shop/Http/Controllers/HomeController.php index 14324284..d109b802 100644 --- a/beike/Shop/Http/Controllers/HomeController.php +++ b/beike/Shop/Http/Controllers/HomeController.php @@ -9,7 +9,7 @@ class HomeController extends Controller public function index() { $data = [ - 'category_products' => ProductRepo::getProductsByCategories([100002, 100003, 100004, 100005]), + 'category_products' => [], ]; $html = '';