[筆記]Laravel 查詢條件

調整prettus/l5-repository中setscope

Select * from XXXX where (aa='xxxx' or bb='ccc' ) and gg='gg'

就為了那個括號。。。原來Package好像做不到,因此調整了一下,為免自己遺忘,筆記一下。。。。

最近在自學PHP及其框架Laravel,對一個向來只會用windows的我真的很。。。。不習慣。。。。很多連裝都不會,但。。。好歹也讓我架了一個環境在Windows上試寫

針對repository,在網路亂逛找了prettus/l5-repository這套件,看看就裝上去了,摸了一下,也大概都能用,有點小問題就調整掉,但在做查詢時,下SQL我是下的很精了。。但用Eloquent ORM這我還真的一個頭二個大

很認真的看了一下,就把套件中的setscope調整成自己合用的,其實我主要解決的問題,SQL很簡單,但用Eloquent ORM要改下才行

只是想達到類似下面的SQL要求

Select * from XXXX where (aa='xxxx' or bb='ccc' ) and gg='gg'

就為了那個括號。。。原來Package好像做不到,因此調整了一下,為免自己遺忘,筆記一下。。。。

 把要用成括號內的條件另外傳囉

        if ($request->has('AccountNo')){
            $qryarray = array_add($qryarray, "AccountNo",['like','%'.$request->input("AccountNo").'%']);            
        }     

        if ($request->has('ChineseName')){            
            $subqryarray = array_add($subqryarray, "ChineseName",['like','%'.$request->input("ChineseName").'%']);
        }        
        if ($request->has('EngName')){
            $subqryarray = array_add($subqryarray, "EngName",['like','%'.$request->input("EngName").'%']);
        }   
        if(count($subqryarray)>0) {
            $qryarray=  array_add($qryarray, 'subQuery1',['or',$subqryarray] );
            $subqryarray=[];
        }
        if ($request->has('DisplayName')){
            $qryarray = array_add($qryarray, "DisplayName",['like','%'.$request->input("DisplayName").'%']);
        }           
        if ($request->has('CompanyMail')){
            $qryarray = array_add($qryarray, "CompanyMail", ['like','%'.$request->input("CompanyMail").'%']);
        }     
        $this->repository->setscope($qryarray);
    public function setscope(array $query) {        
    /*修改人員:JoJo
     * 修改原因:原始的沒有可以用群組or的條件式
     * 修改日期:2016-04-28
     * 
     */        
        //parent::setscope($query);
        $this->scopeQuery(function ($model) use ($query)  {
            $this->model= $this->model->where('CompanyID','=',  WDASGetCompanyID());
            foreach ($query as $fileld=>$value) {              
                if (is_array($value)) {
                    list($conditioin,$val)=$value;   //$val是array,表示包了一個群組查詢,$condition可以傳'or'進來,原則上目前不用
                    if (is_array($val)) {                               
                        //$val中是一個完整的子條件,群組查詢強迫他要傳判斷條件進來,因為懶得再判斷有沒有傳=     
                        $this->model=$this->model->where(function($subquery) use ($val){
                            foreach ($val as $subField=>$subValue) {
                                 list($subcon,$subval)=$subValue;                                 
                                 $subquery=$subquery->orwhere($subField,$subcon,$subval);
                            }                            
                            return $subquery;
                        });                                                
                    }
                    else {
                        $this->model=$this->model->where($fileld,$conditioin,$val); //有傳判斷條件進來(=,like,<>)
                    }

                }
                else {                            
                    $this->model=$this->model->where($fileld,'=',$value);  //沒給判斷式直接=

                }
            }
            return $this->model;
        }
        );
    }

 

打雜打久了,就變成打雜妹

程式寫久了,就變成老乞丐