From 3b633d2801d344ec8f5d0774dc430f4265b66504 Mon Sep 17 00:00:00 2001 From: Edward Yang Date: Mon, 15 Aug 2022 12:15:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=88=86=E7=B1=BB=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=20=E4=B8=80=E6=AC=A1=E6=80=A7=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E6=89=80=E6=9C=89=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- beike/Repositories/CategoryRepo.php | 63 ++++++++++++++++++++++++----- beike/Repositories/MenuRepo.php | 6 +-- 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/beike/Repositories/CategoryRepo.php b/beike/Repositories/CategoryRepo.php index 0980cf2f..264d64fa 100644 --- a/beike/Repositories/CategoryRepo.php +++ b/beike/Repositories/CategoryRepo.php @@ -19,6 +19,9 @@ use Illuminate\Database\Eloquent\Collection; class CategoryRepo { + private static $allCategoryWithName = null; + + public static function flatten(string $locale, $separator = ' > '): array { $sql = "SELECT cp.category_id AS id, TRIM(LOWER(GROUP_CONCAT(cd1.name ORDER BY cp.level SEPARATOR '{$separator}'))) AS name, c1.parent_id, c1.position"; @@ -27,9 +30,7 @@ class CategoryRepo $sql .= " LEFT JOIN categories c2 ON (cp.path_id = c2.id)"; $sql .= " LEFT JOIN category_descriptions cd1 ON (cp.path_id = cd1.category_id)"; $sql .= " WHERE cd1.locale = '" . $locale . "' GROUP BY cp.category_id ORDER BY name ASC"; - $results = DB::select($sql); - - return $results; + return DB::select($sql); } /** @@ -54,13 +55,32 @@ class CategoryRepo /** * 获取产品分类列表 * - * @param array $filter , keyword, a_name, b_name, category_page, per_page + * @param array $filters * @return Builder[]|Collection */ - public static function list(array $filter = []) + public static function list(array $filters = []) + { + $builder = self::getBuilder($filters); + return $builder->get(); + } + + + /** + * 获取筛选builder + * + * @param array $filters + * @return Builder + */ + public static function getBuilder(array $filters = []): Builder { $builder = Category::query()->with(['description']); - return $builder->get(); + $keyword = $filters['keyword'] ?? ''; + if ($keyword) { + $builder->whereHas('description', function ($query) use ($keyword) { + return $query->where('name', 'like', "%$keyword%"); + }); + } + return $builder; } @@ -118,14 +138,37 @@ class CategoryRepo } + /** + * 通过分类ID获取产品名称 + * @param $id + * @return mixed|string + */ public static function getName($id) { - $category = Category::query()->find($id); + $categories = self::getAllCategoryWithName(); + return $categories[$id]['name'] ?? ''; + } - if ($category) { - return $category->description->name; + + /** + * 获取所有商品分类ID和名称列表 + * @return array|null + */ + public static function getAllCategoryWithName(): ?array + { + if (self::$allCategoryWithName !== null) { + return self::$allCategoryWithName; } - return ''; + + $items = []; + $categories = self::getBuilder()->select('id')->get(); + foreach ($categories as $category) { + $items[$category->id] = [ + 'id' => $category->id, + 'name' => $category->description->name ?? '', + ]; + } + return self::$allCategoryWithName = $items; } } diff --git a/beike/Repositories/MenuRepo.php b/beike/Repositories/MenuRepo.php index a22c67ed..6713a1cc 100644 --- a/beike/Repositories/MenuRepo.php +++ b/beike/Repositories/MenuRepo.php @@ -93,10 +93,10 @@ class MenuRepo $link['text'] = $link['text'][$locale] ?: $page->description->title; } } elseif ($link['type'] == 'category') { - $category = Category::query()->find($link['value']); - if ($category) { + $categoryName = CategoryRepo::getName($link['value']); + if ($categoryName) { $link['link'] = type_route('category', $link['value']); - $link['text'] = $link['text'][$locale] ?: CategoryRepo::getName($link['value']); + $link['text'] = $categoryName; } } elseif ($link['type'] == 'product') { $link['link'] = type_route('product', $link['value']);