You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
3.6 KiB

5 years ago
5 years ago
5 years ago
5 years ago
  1. <?php
  2. namespace App\Service\v3\Implementations;
  3. use App\Model\v3\Goods;
  4. use App\Model\v3\Store;
  5. class SearchService implements \App\Service\v3\Interfaces\SearchServiceInterface
  6. {
  7. public function doForGoods($params)
  8. {
  9. $builder = Goods::query()
  10. ->with(['store' => function($query) {
  11. return $query->select(['id', 'logo', 'name']);
  12. }])
  13. ->where(['market_id' => $params['market_id']])
  14. ->where('inventory', '>', 0);
  15. if (isset($params['type_id']) && $params['type_id']) {
  16. $builder->where(['goods_type_id' => $params['type_id']]);
  17. }
  18. if (isset($params['keyword']) && $params['keyword']) {
  19. $builder->where('name', 'like', '%'.$params['keyword'].'%');
  20. }
  21. if (isset($params['order_by']) && $params['order_by']) {
  22. $sort = $params['sort'] ?? 'desc';
  23. switch ($params['order_by']) {
  24. case 'sales':
  25. $builder->orderBySales($sort);
  26. break;
  27. case 'price':
  28. $builder->orderByPrice($sort);
  29. break;
  30. default:
  31. $builder->orderByDefault($sort);
  32. break;
  33. }
  34. }
  35. $builder->select(['id', 'store_id', 'cover_img', 'name', 'spec', 'tags', 'original_price', 'price', 'inventory', 'sales as total_sales']);
  36. $goods = $builder->forPage($params['page'], $params['pagesize'])->get()->toArray();
  37. $data = [];
  38. foreach ($goods as $key => &$item) {
  39. $store = (object)$item['store'];
  40. unset($item['store']);
  41. $data[] = [
  42. 'goods' => $item,
  43. 'store' => $store
  44. ];
  45. }
  46. return $data;
  47. }
  48. public function doForStores($params)
  49. {
  50. $builder = Store::query()
  51. ->with(['goods' => function($query) {
  52. return $query->limit(5)
  53. ->select(['id', 'store_id', 'cover_img', 'name', 'spec', 'tags', 'original_price', 'price', 'inventory', 'sales as total_sales']);
  54. }])
  55. ->where(['market_id' => $params['market_id']]);
  56. if (isset($params['store_id']) && $params['store_id']) {
  57. $builder->where(['store_id' => $params['store_id']]);
  58. }
  59. if (isset($params['type_id']) && $params['type_id']) {
  60. $builder->where(['store_type_id' => $params['type_id']]);
  61. }
  62. if (isset($params['keyword']) && $params['keyword']) {
  63. $builder->where('name', 'like', '%'.$params['keyword'].'%');
  64. }
  65. if (isset($params['order_by']) && $params['order_by']) {
  66. $sort = $params['sort'] ?? 'desc';
  67. switch ($params['order_by']) {
  68. case 'sales':
  69. $builder->orderBySales($sort);
  70. break;
  71. default:
  72. $builder->orderByDefault($sort);
  73. break;
  74. }
  75. }
  76. $builder->select(['id', 'logo', 'name']);
  77. $stores = $builder->forPage($params['page'], $params['pagesize'])->get()->toArray();
  78. return $stores;
  79. }
  80. public function getHotKeywords($type)
  81. {
  82. $keywords = [
  83. 'goods' => ['酱油','油','生蚝'],
  84. 'store' => ['黄姐','王姐','黄姐蔬菜摊'],
  85. ];
  86. return $keywords[$type];
  87. }
  88. public function do()
  89. {
  90. // TODO: Implement do() method.
  91. }
  92. public function check()
  93. {
  94. // TODO: Implement check() method.
  95. }
  96. public function undo()
  97. {
  98. // TODO: Implement undo() method.
  99. }
  100. }