php - 在 Laravel 中搜索关系和日期

标签 php mysql laravel eloquent

因此,我正在搜索具有多个标签的记录,并且只想显示 start_date 已经过去的结果。无论开始日期是什么,它似乎都可以接受其显示作业。 close 方法是我自己创建的一种方法,用于计算一定距离的结果,其代码如下

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();

谁能告诉我问题出在哪里吗?任何帮助将不胜感激。

最佳答案

$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();

关于php - 在 Laravel 中搜索关系和日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29967381/

相关文章:

php - mysql时间类型显示12 :00 AM as default value

mysql - Group_concat 显示限制结果

mysql - 关系数据库中自定义字段的设计模式

php - Laravel 集合 : Shift Value *and* Key?

mysql - Laravel 多对多关系OrderBy

php - 如何根据数据库中的值更改开关显示

php - 我将如何在非 laravel 应用程序的子文件夹中使用 Laravel 完整框架

php - 在 Laravel 5.5 中通过路由名称获取 API URL

php - 在抽象函数中将参数设为可选

mysql - 如何计算每个类别的职位的唯一点击次数