将SQL查询转换为Eloquent

时间:2017-12-19 21:27:42

标签: mysql laravel eloquent

我有以下sql查询,我需要转换为Eloquent查询我在用户表中有latlng字段。经过一番搜索后,我发现有一种$user->whereRaw()方法可以说是雄辩,但就我而言。我需要选择25英里范围内的所有用户。

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

它应该工作为$user->whereRaw()我认为至少这是我能找到的全部。

我需要提一下,我在此之前和之后做了很多查询,例如

$user->where()
$user->where()
Then this query needs to run
$user->where()
and finally
$user->get()

1 个答案:

答案 0 :(得分:1)

在这种情况下,您正在聚合数据,因此主要用于已知数据库属性的雄辩构建器,您可能需要在查询中使用原始表达式。要创建原始表达式,您可以使用DB::raw,并且混合的雄辩查询将是:

$markersModel->select(DB::raw('users.id, ( 3959 * acos( cos( radians(37) ) * cos( radians( users.lat ) ) * cos(radians( users.lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( users.lat ) ) ) ) AS distance'))
     ->where('distance', '<' ,25)
     ->orderBy('distance')
     ->take(20)
     ->get();

很简单,不要忘记导入use DB;

<强>更新

不应该是一个问题,你可以继续修改构建器,直到最后你用get()执行它,这样就可以了:

$user->where()
$user->where()
$user->select(DB::raw('users.id, ( 3959 * acos( cos( radians(37) ) * cos( radians( users.lat ) ) * cos(radians( users.lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( users.lat ) ) ) ) AS distance'))
     ->where('distance', '<' ,25);
$user->where()
and finally
$user->orderBy('distance')
     ->take(20)
     ->get();