基于la变量中是否存在post变量的搜索查询

时间:2017-01-16 13:19:11

标签: php ajax laravel

我想在Laravel上根据“关键字”或“经验”或“位置”编写搜索查询,如果存在任何这些变量,则应运行搜索查询。

我正在进行Ajax调用以实现此目的

jobsController.php

public function homepageSearch() {
    $_POST = json_decode(file_get_contents('php://input'), true);
    $jobs =  Jobs::latest('created_at')->search()->get();
    echo $jobs;
}

模型jobs.php

class Jobs extends Model {
    public function scopeSearch($query) {
        $query->where('job_title', 'like', '%'.$_POST['keyword'].'%')
              ->orWhere('job_description', 'like', '%'.$_POST['keyword'].'%');

        if(isset($_POST['keyword'])) {
            $query->where('job_title', 'like', '%'.$_POST['keyword'].'%')
                  ->orWhere('job_description', 'like', '%'.$_POST['keyword'].'%');
        }

        if(isset($_POST['experience'])) {
            $query->where('min_exp', $_POST['experience'])
                  ->orWhere('max_exp', $_POST['experience']);   
        }

        if(isset($_POST['city'])) {
            $query->where('job_location','like','%'.$_POST['city'].'%');
        }
    }
}

我想在关键词或城市的基础上搜索,或者经验是否是在laravel中实现这一目标的正确方法?

我是Laravel的新手。你能用这个建议我。

1 个答案:

答案 0 :(得分:1)

class Job extends Model {
    public function scopeSearch($query, $keyword, $experience, $city) {
        $query->where(function ($q) {
            $q->where('job_title', 'like', '%'.$_POST['keyword'].'%')
              ->orWhere('job_description', 'like', '%'.$_POST['keyword'].'%');
        });

        if(isset($keyword)) {
            $query->where(function ($q) {
                $q->where('job_title', 'like', '%'.$_POST['keyword'].'%')
                  ->orWhere('job_description', 'like', '%'.$_POST['keyword'].'%');
            });
        }

        if(isset($experience)) {
            $query->where(function($q) {
                $q->where('min_exp', $_POST['experience'])
                  ->orWhere('max_exp', $_POST['experience']);   
            });
        }

        if(isset($city)) {
            $query->where('job_location','like','%'.$_POST['city'].'%');
        }

    return $query;
    }
}

使用以下方法从您的控制器进行呼叫:

Job::search($request->input('keyword'), 
$request->input('experience'), $request->input('city'));

一些意见/建议:

  1. 链接需要正确的地方。当你说$ query-> where(.. a ..) - > orWhere(.. b ..) - > where(.. c ..) - > orWhere(.. d ..)它将评估为:((&& c)|| b || d)。你想要的地方((a || b)&&(c || d))。这就是为什么你需要使用parameter grouping
  2. 之类的闭包
  3. 避免使用$ _POST,请使用Request对象,因为当您使用$ request时,Laravel会为您做很多工作
  4. 避免从模型中调用您的请求对象。检查请求/发布变量不是模型的责任,您的控制器有责任这样做。使用dynamic scopes代替分离责任
  5. 您需要在范围
  6. 中返回查询对象
  7. 模型是一个实体。所以"一份工作"是一个不是"工作"的模型。所以我将Jobs类重命名为Job:)