【发布时间】:2017-05-30 00:48:31
【问题描述】:
我正在使用 Laravel 构建搜索列表应用程序;该应用程序需要按距离(我已经建立)搜索商家,并包含对商家的最新订阅(如果有),以便我可以按距离订购。
这里的两种模式是商业模式和订阅模式。一个企业可以有多个订阅(尽管永远只有一个处于活动状态)。
控制器
$businesses = Business::distance($place['lat'], $place['lng'], $request->distance)
->ofShopType($request->shop_type)
->uptoBudget($request->price)
->leftJoin('subscriptions', function($join) {
$join->on('businesses.id', '=', 'subscriptions.business_id')
->orderBy('subscriptions.created_at', 'desc');
});
return $businesses = $businesses->get();
商业模式
public function scopeDistance($query,$from_latitude,$from_longitude,$distance)
{
$raw = \DB::raw('ROUND ( ( 3959 * acos( cos( radians('.$from_latitude.') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$from_longitude.') ) + sin( radians('.$from_latitude.') ) * sin( radians( latitude ) ) ) ), 1 ) AS distance');
return $query->select('*')->addSelect($raw)
->orderBy( 'distance', 'ASC' )
->groupBy('businesses.id')
->having('distance', '<=', $distance);
}
所以我遇到的困难是business.id 字段被subscription.id 覆盖。
我已经进行了一些搜索,并阅读了在 leftJoin 之前包含 ->select('businesses.*') 应该解决此问题,但是这样做会出现以下错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column
'business.distance' in 'having clause'
(SQL: select `businesses`.*
from `businesses`
left join `subscriptions`
on `businesses`.`id` = `subscriptions`.`business_id`
where `shop_type_id` = 1
and `min_cost` <= 100
group by `distance`, `businesses`.`id`
having `distance` <= 50
order by `distance` asc)
第二个问题是left join好像拿到了第一条记录,我想获取最近的一条记录(bycreated_at)。您可以看到我的控制器中已经有一个 orderBy 行,但这没有影响,因为我可以看到它仍然返回旧记录,即使有新记录可用。
【问题讨论】:
-
你为什么按
distance分组? -
这是一个错误,我已经更新了查询。距离字段仍然存在问题,但现在在有子句中。
-
有时编写 SQL 比弄清楚如何使用 3rd 方软件创建 SQL 更容易。 -
@Imran 请在 sql fiddle 上添加您的表