sql語(yǔ)句,有條件按條件查詢褐鸥,沒(méi)條件則查詢?nèi)?/h1>

場(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é)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者

  • 序言:七十年代末眷蚓,一起剝皮案震驚了整個(gè)濱河市鼻种,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沙热,老刑警劉巖叉钥,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異篙贸,居然都是意外死亡投队,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門爵川,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)敷鸦,“玉大人,你說(shuō)我怎么就攤上這事“桥” “怎么了值依?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)碟案。 經(jīng)常有香客問(wèn)我愿险,道長(zhǎng),這世上最難降的妖魔是什么蟆淀? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任拯啦,我火速辦了婚禮,結(jié)果婚禮上熔任,老公的妹妹穿的比我還像新娘褒链。我一直安慰自己,他們只是感情好疑苔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布甫匹。 她就那樣靜靜地躺著,像睡著了一般惦费。 火紅的嫁衣襯著肌膚如雪兵迅。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天薪贫,我揣著相機(jī)與錄音恍箭,去河邊找鬼。 笑死瞧省,一個(gè)胖子當(dāng)著我的面吹牛扯夭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鞍匾,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼交洗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了橡淑?” 一聲冷哼從身側(cè)響起构拳,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梁棠,沒(méi)想到半個(gè)月后置森,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掰茶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年暇藏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片濒蒋。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盐碱,死狀恐怖把兔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓮顽,我是刑警寧澤县好,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站暖混,受9級(jí)特大地震影響缕贡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拣播,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一晾咪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贮配,春花似錦谍倦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至圆存,卻和暖如春叼旋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沦辙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工夫植, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人油讯。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓偷崩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親撞羽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法衫冻,類相關(guān)的語(yǔ)法诀紊,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法隅俘,異常的語(yǔ)法邻奠,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,643評(píng)論 18 399
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)为居,斷路器碌宴,智...
    卡卡羅2017閱讀 134,667評(píng)論 18 139
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    Joyyx閱讀 8,328評(píng)論 0 16
  • 朋友圈里贰镣,QQ空間里都是大家精彩紛呈的大學(xué)生活呜象,再看看自己的社交軟件里面,寥寥無(wú)幾碑隆,哪怕不從社交軟件看恭陡,就拿自己的...
    賀嘉禾閱讀 535評(píng)論 0 2
  • 我想這篇文章應(yīng)該配首背景音樂(lè)休玩,就配光輝歲月吧,讓后來(lái)的日子回想起來(lái)更有些許味道劫狠。 曾經(jīng)父親就告訴過(guò)我拴疤,寫文章要“趁...
    秋葉文風(fēng)閱讀 455評(píng)論 0 0