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.
 
 

124 lines
3.6 KiB

<?php
namespace App\Service\v3\Implementations;
use App\Model\v3\Goods;
use App\Model\v3\Store;
class SearchService implements \App\Service\v3\Interfaces\SearchServiceInterface
{
public function doForGoods($params)
{
$builder = Goods::query()
->with(['store' => function($query) {
return $query->select(['id', 'logo', 'name']);
}])
->where(['market_id' => $params['market_id']])
->where('inventory', '>', 0);
if (isset($params['type_id']) && $params['type_id']) {
$builder->where(['goods_type_id' => $params['type_id']]);
}
if (isset($params['keyword']) && $params['keyword']) {
$builder->where('name', 'like', '%'.$params['keyword'].'%');
}
if (isset($params['order_by']) && $params['order_by']) {
$sort = $params['sort'] ?? 'desc';
switch ($params['order_by']) {
case 'sales':
$builder->orderBySales($sort);
break;
case 'price':
$builder->orderByPrice($sort);
break;
default:
$builder->orderByDefault($sort);
break;
}
}
$builder->select(['id', 'store_id', 'cover_img', 'name', 'spec', 'tags', 'original_price', 'price', 'inventory', 'sales as total_sales']);
$goods = $builder->forPage($params['page'], $params['pagesize'])->get()->toArray();
$data = [];
foreach ($goods as $key => &$item) {
$store = (object)$item['store'];
unset($item['store']);
$data[] = [
'goods' => $item,
'store' => $store
];
}
return $data;
}
public function doForStores($params)
{
$builder = Store::query()
->with(['goods' => function($query) {
return $query->limit(5)
->select(['id', 'store_id', 'cover_img', 'name', 'spec', 'tags', 'original_price', 'price', 'inventory', 'sales as total_sales']);
}])
->where(['market_id' => $params['market_id']]);
if (isset($params['store_id']) && $params['store_id']) {
$builder->where(['store_id' => $params['store_id']]);
}
if (isset($params['type_id']) && $params['type_id']) {
$builder->where(['store_type_id' => $params['type_id']]);
}
if (isset($params['keyword']) && $params['keyword']) {
$builder->where('name', 'like', '%'.$params['keyword'].'%');
}
if (isset($params['order_by']) && $params['order_by']) {
$sort = $params['sort'] ?? 'desc';
switch ($params['order_by']) {
case 'sales':
$builder->orderBySales($sort);
break;
default:
$builder->orderByDefault($sort);
break;
}
}
$builder->select(['id', 'logo', 'name']);
$stores = $builder->forPage($params['page'], $params['pagesize'])->get()->toArray();
return $stores;
}
public function getHotKeywords($type)
{
$keywords = [
'goods' => ['酱油','油','生蚝'],
'store' => ['黄姐','王姐','黄姐蔬菜摊'],
];
return $keywords[$type];
}
public function do()
{
// TODO: Implement do() method.
}
public function check()
{
// TODO: Implement check() method.
}
public function undo()
{
// TODO: Implement undo() method.
}
}