不懂就问,这么写,是不是很费资源。。。
原来#
$merchants = Merchant::where('ident_status',10)
->select('id', 'company_name', 'store_pic', 'goods_category', 'location_name', 'latitude', 'longitude')
->selectRaw(\DB::raw('(6371 * acos(cos(radians(' . $userLatitude . ')) * cos(radians(latitude)) * cos(radians(longitude) - radians(' . $userLongitude . ')) + sin(radians(' . $userLatitude . ')) * sin(radians(latitude)))) AS distance'))
->with('merchant_goods:id,merchant_id,merchant_goods_total_price,merchant_goods_sell_price,merchant_goods_title')
->orderBy('created_at', 'desc')
->paginate(10);
其中,下面是在算用户和商户的实时距离
selectRaw(\DB::raw('(6371 * acos(cos(radians(' . $userLatitude . ')) * cos(radians(latitude)) * cos(radians(longitude) - radians(' . $userLongitude . ')) + sin(radians(' . $userLatitude . ')) * sin(radians(latitude)))) AS distance'))
现在更复杂了#
merchant 和 merchant_goods 两张表,要在 merchant 计算距离,要在 merchant_goods 统计商户的所有商品销量,还要列出 merchant 对应的所有 merchant_goods,
$merchantsQuery = Merchant::join('merchant_goods', 'merchants.id', '=', 'merchant_goods.merchant_id')
->where('merchants.ident_status', 10)
->has('merchant_goods')
->select('merchants.id', 'merchants.user_id', 'merchants.company_name', 'merchants.store_pic', 'merchants.goods_category', 'merchants.location_name', 'merchants.latitude', 'merchants.longitude')
->selectRaw(\DB::raw('(6371 * acos(cos(radians(' . $userLatitude . ')) * cos(radians(merchants.latitude)) * cos(radians(merchants.longitude) - radians(' . $userLongitude . ')) + sin(radians(' . $userLatitude . ')) * sin(radians(merchants.latitude)))) AS distance'))
->selectRaw('SUM(merchant_goods.fake_sell_count) AS fake_sell_count')
->groupBy('merchants.id', 'merchants.user_id', 'merchants.company_name', 'merchants.store_pic', 'merchants.goods_category', 'merchants.location_name', 'merchants.latitude', 'merchants.longitude')
->with('merchant_goods:id,merchant_id,merchant_goods_total_price,merchant_goods_sell_price,merchant_goods_title');
if($category == 'default') {
$merchantsQuery->orderBy('merchants.created_at', 'desc');
}
if($category == 'lbs') {
$merchantsQuery->orderBy('distance', 'asc');
}
if($category == 'sell') {
$merchantsQuery->orderBy('fake_sell_count', 'desc');
}
$merchants = $merchantsQuery->paginate(7);
model 优化版 (计算在 model 里了,但是速度更慢了,同时 100 条 1.2s,直接写 sql 里算 900ms 左右)#
public function list(Request $request) {
$category = $request->category;
$userLatitude = $request->latitude;
$userLongitude = $request->longitude;
//select、with的时候id或者ORM匹配的字段一定要有,不然with会失效
$merchantsQuery = Merchant::join('merchant_goods', 'merchants.id', '=', 'merchant_goods.merchant_id')
->where('merchants.ident_status', 10)
->has('merchant_goods')
->select('merchants.id', 'merchants.user_id', 'merchants.company_name', 'merchants.store_pic', 'merchants.goods_category', 'merchants.location_name', 'merchants.latitude', 'merchants.longitude')
->selectRaw('SUM(merchant_goods.fake_sell_count) AS fake_sell_count')
->groupBy('merchants.id', 'merchants.user_id', 'merchants.company_name', 'merchants.store_pic', 'merchants.goods_category', 'merchants.location_name', 'merchants.latitude', 'merchants.longitude')
->with('merchant_goods:id,merchant_id,merchant_goods_total_price,merchant_goods_sell_price,merchant_goods_title');
// 在这里输出$merchants之前,可以对其进行遍历,计算每个商家距离用户的距离
foreach ($merchantsQuery->get() as $merchants) {
$merchants->distance; // 访问距离属性,会触发getDistanceAttribute()方法进行计算
}
if($category == 'default') {
$merchantsQuery->orderBy('merchants.created_at', 'desc');
}
if($category == 'lbs') {
$merchantsQuery->orderBy('merchants.distance', 'asc');
}
if($category == 'sell') {
$merchantsQuery->orderBy('fake_sell_count', 'desc');
}
$merchants = $merchantsQuery->paginate(100);
return response()->json(['data' => $merchants],201);
}
推荐文章: