Laravel查询构建器连接不与selectRaw一起使用

时间:2017-12-07 10:42:32

标签: mysql laravel laravel-5 laravel-eloquent laravel-query-builder

我正在使用laravel的查询构建器从我的数据库中获取位置。我需要加入2个表,然后按位置查询结果。在我添加连接之前,一切正常。

如果我这样做

$locations = DB::table('locations')
->join('charities', 'locations.charity', '=', 'charities.charity')
    ->when($charity, function ($query) use ($charity) {
          return $query->where('charity', '=', $charity);
    })
    ->get();

然后它返回我需要的两个表的内容。如果我做

$locations = DB::table('locations')
            ->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])
            ->when($charity, function ($query) use ($charity) {
                return $query->where('charity', '=', $charity);
            })
            ->get();

然后我得到位置表的内容,过滤器工作正常。

我将两者放在一起,它只返回没有错误的位置内容,并且没有加入慈善表。

$locations = DB::table('locations')
            ->join('charities', 'locations.charity', '=', 'charities.charity')
            ->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])
            ->when($charity, function ($query) use ($charity) {
                return $query->where('charity', '=', $charity);
            })
            ->get();

1 个答案:

答案 0 :(得分:0)

在MosCH评论之后我得到了它的工作,非常简单的修复,如果其他人有这个问题,请参阅下面的代码。您会注意到我在where子句中指定了locations.charity因为慈善机构是我加入的,我猜它是冲突的。

$locations = DB::table('locations')
            ->join('charities', 'locations.charity', '=', 'charities.charity')
            ->select('*')
            ->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])
            ->when($charity, function ($query) use ($charity) {
                return $query->where('locations.charity', '=', $charity);
            })
            ->get();