问题描述
我正在尝试使用laravel查询从表学生中选择行,但是在搜索时会从表中返回所有行。
$data = DB::table('students')
->select(['name','username'])->where('institute',$inst)
->where('username','LIKE','%'.$search.'%')
->orWhere('name','%'.$search.'%')
->orWhere('email','%'.$search.'%')
->orWhere('contact','%'.$search.'%')
->orderBy('id','DESC')
->paginate(10);
解决方法
这就是问题,至少就我所知,您有两种过滤器:
- 给定机构中的学生
- 用户名,姓名,电子邮件或联系人与给定搜索词相似的学生
如果是,则查询中的问题是orWhere()
子句。让我们简化查询以说明问题:
$data = DB::table('students')
->where('institute',$inst)
->orWhere('name','LIKE','%'.$search.'%')
->get();
在上面的代码中,该语句将使所有institute
等于$inst
OR 且其名称类似于%search%
的学生。因此,结果可能包括不在给定学院中的学生。您现在看到问题了吗?
要首先按机构 AND 进行过滤,以获取具有相似的用户名,姓名,电子邮件或联系方式的记录,则可以将第二个条件包装在结尾处。试试这个:
$data = DB::table('students')
->select(['name','username'])
->where('institute',$inst)
->where(function ($query) use ($search) { // <<<
$query->where('username','%'.$search.'%')
->orWhere('name','%'.$search.'%')
->orWhere('email','%'.$search.'%')
->orWhere('contact','%'.$search.'%');
})
->orderBy('id','DESC')
->paginate(10);