Laravel Eloquent只在需要的地方和订单条件

时间:2017-08-30 07:22:39

标签: php laravel laravel-5 laravel-eloquent

请查看以下代码。这段代码我用Codeigniter编写。我需要强调的是条件和订单条件只有在设置了这些发布请求后才能起作用。否则我只是select * from student

Codeigniter代码

$this->db->select('*');
$this->db->from('student');
if($this->input->post('first_name') != NULL){
    $first_name = $this->input->post('first_name');
    $this->db->where('first_name', $first_name);
}

if($this->input->post('last_name') != NULL){
    $last_name= $this->input->post('last_name');
    $this->db->where('last_name', $last_name);
}

if($this->input->post('order_by') != NULL){
    $order_by= $this->input->post('order_by');
    $this->db->order_by($order_by);
}

$query = $this->db->get();

Laravel代码

我将用laravel做同样的事情。

$first_name = $request->input('first_name');
$last_name = $request->input('last_name');
$order_by = $request->input('$order_by');

$students = Student::orderBy($order_by)
      ->where('first_name',$first_name)
      ->where('last_name',$last_name);
      ->paginate(10);

我能够运行上面的代码。所有发布请求时代码都有效。

但如果没有first_name发布请求,我需要删除->where('first_name',$first_name)

如果我没有order_by发布请求,我需要删除orderBy($order_by)

如何使用上面的Laravel代码。

5 个答案:

答案 0 :(得分:5)

你可以使用喜欢,

Size(age(n+1)) > Size(age(n))

答案 1 :(得分:0)

同样的方法:

$first_name = $request->input('first_name');
$last_name = $request->input('last_name');
$order_by = $request->input('$order_by');

$query = Student::orderBy($order_by);
if ($first_name) {
    $query->where('first_name',$first_name);
}

if ($last_name) {
    $query->where('last_name',$last_name);
}

$students = $query->paginate(10);
return $students;

答案 2 :(得分:0)

你可以这样做,

$first_name = $request->input('first_name');
$last_name = $request->input('last_name');
$order_by = $request->input('order_by');

$query = DB::table('student');

if($request->first_name){
    $query->where('first_name',$first_name)
}

if($request->last_name){
    $query->where('last_name',$last_name);
}

if($request->order_by){
    $query->orderBy($order_by);
}

$students = $query->paginate(10);

希望你明白。

答案 3 :(得分:0)

$query = Student::where('last_name',$last_name);
if ($request->has('first_name')) {
    $query->where('first_name',$first_name);
}
if ($request->has('order_by')) {
    $query->orderBy($order_by);
}

$students = $query->paginate(10);

答案 4 :(得分:0)

一种方法是检查名称是否已设置,然后将其添加到查询构建器中,如下所示:

$first_name = $request->input('first_name');
...

$students = Student::orderBy($order_by)
if ($first_name) {
    $students->where('first_name',$first_name)
}

$students->paginate(10);

然而你可以清理它!从Laravel 5.2.27开始,您可以执行以下操作:

$students = Student::orderBy($order_by)
->when($request->input('first_name'), function($query) use ($request){
    return $query->where('first_name', $request->input('first_name'));
})
->paginate(10);

为了使其更具可读性,您可以为if语句使用自定义宏:

$students = Student::orderBy($order_by)
->if($request->input('first_name'), 'first_name', '=', $request->input('first_name'))
->paginate(10);

宏观:

use Illuminate\Database\Query\Builder;

Builder::macro('if', function ($condition, $column, $operator, $value) {
    if ($condition) {
        return $this->where($column, $operator, $value);
    }

    return $this;
});

来源:https://themsaid.com/laravel-query-conditions-20160425 我希望这有帮助!