場(chǎng)景:很多時(shí)候我們遇到查詢問(wèn)題的解決线脚,都是條件比較少的查詢。一般都是if判斷那個(gè)條件是否存在叫榕,存在則用where查詢條件浑侥,不存在則直接查詢?nèi)俊_@樣只能解決一兩個(gè)條件查詢晰绎。如果條件比較多的話寓落,我們需要做的if判斷的次數(shù)就是n的次方
第一個(gè)例子
假設(shè)我們有一個(gè)用戶表
users
,我們條件查詢的有三個(gè)字段荞下,age
,name
,class
伶选。
解決思路。我們先從我們需要的結(jié)果查起尖昏。我們需要的結(jié)果可能是以下結(jié)果
1. select * from users;
2. select * from users where age = $age;
3. select * from users where name = $name;
4. select * from users where class = $class;
5. select * from users where age = $age and name = $name and class = $class
..... 一共會(huì)有十種(3*3+1)可能性仰税;
我們觀察下,可以看到 select * from users 這句話是一直存在的会宪,但是后面的where條件是變動(dòng)的肖卧。
于是,我們可以把where條件作為一個(gè)變量 即 select * from users $where
我們?cè)趯?shí)際項(xiàng)目中掸鹅,代碼可以是這樣
// 首先可以獲取條件變量塞帐,我們直接把他們存到一個(gè)數(shù)組里面,并且鍵巍沙,一定要與我們的字段名相對(duì)應(yīng)
$arr = array();
$newarr = array();
// 注意葵姥,此處的$arr定義不定義都可以,以為即使變量沒(méi)值句携,也會(huì)賦值沒(méi)個(gè)鍵為空
// 但是$newarr必須先預(yù)定義為數(shù)組榔幸。因?yàn)槿绻旅鎓oreach遍歷$arr的話,$arr如果為空,$newarr是沒(méi)有鍵和值的,就會(huì)報(bào)錯(cuò)沒(méi)有預(yù)定義
$arr['age']= $_POST['age']?$_POST['age']:'';
$arr['name'] = $_POST['name']?$_POST['name']:'';
$arr['class'] = $_POST['class']?$_POST['class']:'';
// 這個(gè)時(shí)候我們得到的數(shù)組削咆,即使值是空牍疏,也會(huì)存在于$arr字段里面。那么拨齐,我們需要去掉無(wú)用的搜索字段鳞陨,
// 即,$arr['xx''] == null的字段瞻惋,或者也可以說(shuō)是empty($arr['xx'])的字段
foreach ($arr as $key => $val){
// 遍歷數(shù)組厦滤,如果值不為空,則組合到新的數(shù)組$newarr[]里面歼狼。注意要把鍵帶上
if(!empty($val)){
$newarr[$key] = $val;
}
}
我們打印下$newarr可以看到結(jié)果如下圖掏导。正是用戶查詢的字段條件
$arr可以不預(yù)定義
dd($newarr)
- 我們知道,數(shù)組可以直接放進(jìn)where條件查詢的羽峰。我們先打印一個(gè)where是數(shù)組的條件語(yǔ)句試下
image.png
那么 此時(shí)我們的查詢語(yǔ)句可以寫成這樣
if ($newarr==null){
// 或者 if(empty($newarr))
$res = \DB::table('users')->get();
}else{
$res = \DB::table('users')->where($newarr)->get();
}
注意---我們這里用到了$newarr變量趟咆,我們一定要在使用之前先定義$newarr=array(),不然會(huì)報(bào)錯(cuò)未定義Undefined
- 下面把做好的代碼展示下
public function test3()
{
$newarr = array();
$arr['age']= $_POST['age']?$_POST['age']:'';
$arr['name'] = $_POST['name']?$_POST['name']:'';
$arr['class'] = $_POST['class']?$_POST['class']:'';
foreach ($arr as $key => $val){
if(!empty($val)){
$newarr[$key] = $val;
}
}
if ($newarr==null){
// 或者 if(empty($newarr))
$res = \DB::table('users')->get();
}else{
$res = \DB::table('users')->where($newarr)->get();
}
dd($res);
}
其實(shí)如果我們想簡(jiǎn)單一點(diǎn),可以直接$where = $request->except(['不需要的字段']);
這個(gè)前提是梅屉,我們請(qǐng)求的字段必須與我們數(shù)據(jù)表的字段相對(duì)應(yīng)
我們只需要檢查$where 也就是我們接受到的查詢條件是否為空就行了
第二個(gè)例子
如果我們的條件查詢是兩個(gè)類別的字段忍啸,則只需判斷是那個(gè)類別的字段即可,比如下面的圖1履植,
兼職分類
和地區(qū)分類
是由兩個(gè)分類表(圖2)遍歷到模版的。
圖1.png
圖2
控制器 Route::get('/', 'HomeController@index');
在blade模版里面
<div class="row">
@foreach($tagjobs as $data)
<div class="col-md-2 text-center"><a href="{{ url('/?tag_job_id='.$data->id) }}">{{ $data->name }}</a></div>
@endforeach
</div>
<div class="row">
@foreach($tagsarea as $data)
<div class="col-md-2 text-center"><a href="{{ url('/?tag_area_id='.$data->id) }}">{{ $data->name }}</a></div>
@endforeach
</div>
控制器里面 悄晃。 如果由條件則按條件查詢玫霎,沒(méi)條件則查詢出來(lái)全部
public function index(Request $request)
{
// $tag_area_id = $request->input('tag_area_id');
// $tag_job_id = $request->input('tag_job_id');
//// 先檢查tag_area_id是否存在,存在則查詢妈橄,不存在則查看tag_job_id是否存在庶近。也不存在則是全部
// if ($tag_area_id ){
// $where = ['tag_area_id'=>$tag_area_id];
// }else{
// if ($tag_job_id ){
// $where = ['tag_job_id'=>$tag_job_id];
// }else{
// $where = null;
// }
// }
// 因?yàn)槲覀兒竺娴膮?shù)直接就是對(duì)應(yīng)的job_publish字段,所以我們可以直接 $request->all();獲取條件
$where = $request->all();
if ($where==null){
$jobpublishs = DB::table('job_publish')->get();
}else{
$jobpublishs = DB::table('job_publish')->where($where)->get();
}
return view('home',compact('jobpublishs'));
}
dd(\Request::all()); 的結(jié)果