在laravel

时间:2015-04-30 12:07:30

标签: php mysql laravel eloquent

所以我正在搜索具有多个标签的记录,我只想用已经通过的start_date显示结果。无论开始日期如何,它似乎都能接受其显示的工作。 near方法是我自己创建的用于计算具有一定距离的结果的方法,其代码低于

public function scopeNear($query, $latitude, $longitude, $distance = 0) {
    $query->addSelect(DB::raw("*, 3959 * acos( cos( radians($latitude) ) * cos( radians( geolat ) ) * cos( radians( geolng ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( geolat ) ) ) AS distance"));

    if( $distance > 0 )
        $query->having('distance', '<', $distance);

    return $query->orderBy('distance', 'ASC');
}

此功能正常,如果我这样做

$jobs = \App\Job::near($lat, $lng, $distance)->where('start_date', '<=', Carbon::now())->get();

也可以。但是,当我使用我的完整查询(下面)时,我得到了结果,但正如我所说他们没有按预期过滤开始日期。

$search = preg_split("/[\s,]+/", $request->input('keywords'));

$jobs = \App\Job::near($lat, $lng, $distance)->whereHas('skills', function ($query) use ($search) {
        foreach ($search as $keyword) {
            $query->where('name', 'LIKE', "%$keyword%");
        }
    })->orWhereHas('sectors', function ($query) use ($search) {
        foreach ($search as $keyword) {
            $query->where('name', 'LIKE', "%$keyword%");
        }
    })->orWhereHas('title', function ($query) use ($search) {
        foreach ($search as $keyword) {
            $query->where('name', 'LIKE', "%$keyword%");
        }
    })->where('start_date', '<=', Carbon::now())->get();

有谁能告知问题是什么?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

$query->where(...)返回修改后的对象,而不是操纵被调用的实例。您需要不断更新并返回查询对象,如下所示:

$search = preg_split("/[\s,]+/", $request->input('keywords'));

$jobs = \App\Job::near($lat, $lng, $distance)->whereHas('skills', function ($query) use ($search) {
        foreach ($search as $keyword) {
            $query = $query->where('name', 'LIKE', "%$keyword%");
        }

        return $query;
    })->orWhereHas('sectors', function ($query) use ($search) {
        foreach ($search as $keyword) {
            $query = $query->where('name', 'LIKE', "%$keyword%");
        }

        return $query;
    })->orWhereHas('title', function ($query) use ($search) {
        foreach ($search as $keyword) {
            $query = $query->where('name', 'LIKE', "%$keyword%");
        }

        return $query;
    })->where('start_date', '<=', Carbon::now())->get();