所以我正在搜索具有多个标签的记录,我只想用已经通过的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();
有谁能告知问题是什么?任何帮助将不胜感激。
答案 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();