我一直在寻找我试图运行的查询的解决方案。 我有一个名为locations的数据库表,我需要用户能够提交表单来更改/过滤返回的结果。
用户可以选择的2个字段是慈善机构&距离 这些字段不是强制性的,因此需要检查它们是否已设置。
我目前已经使用了距离但是当使用AND WHERE填充它们时无法使用它
这是我的控制器功能
public function search(Request $request)
{
$circle_radius = 3959;
$max_distance = $request->Input(['distance']);
$charity = $request->Input(['charities']);
$lat = '53.5526';
$lng = '-1.479726';
$locations = DB::select(
'SELECT * FROM
(SELECT *, (' . $circle_radius . ' * acos(cos(radians(' . $lat . ')) * cos(radians(latitude)) *
cos(radians(longitude) - radians(' . $lng . ')) +
sin(radians(' . $lat . ')) * sin(radians(latitude))))
AS distance
FROM locations) AS distances
WHERE distance < ' . $max_distance . '
AND charity = ' . $charity . '
ORDER BY distance;
');
return view('map.search', compact('locations'));
}
如果我采用AND慈善线,它只适用于距离,但我需要两者
答案 0 :(得分:0)
通过执行以下操作让我的查询正常工作。如果有人知道一个更好的解决方案,那将是件好事。
$max_distance = $request->input('distance');
$charity = $request->input('charities');
$lat = '53.5526';
$lng = '-1.479726';
$locations = Location::select('locations.*')
->selectRaw('( 3959 * acos( cos( radians(?) ) *
cos( radians( latitude ) )
* cos( radians( longitude ) - radians(?)
) + sin( radians(?) ) *
sin( radians( latitude ) ) )
) AS distance', [$lat, $lng, $lat])
->havingRaw("distance < ?", [$max_distance])
->where('charity', '=', $charity)
->get();