laravel 5.4我可以在where子句中使用自定义方法

时间:2017-11-14 11:20:25

标签: php laravel laravel-5

我试图在查询构建期间调用自定义模型函数中的方法但是会出错。这种方式是可能的。实际上我试图在两个函数中破解查询,因为filterData可能很长

在模特中,我写得像这样

public function get_filter_sql2($query, $filterData){

        if( count($filterData) > 0 ){   

            foreach($filterData as $key=>$value){   

                if( $value!=''){

                    if( $key == 'title' ){
                        $query->where('b.title', 'LIKE', '%'.$value.'%');
                    }
                    if( $key == 'bannercatID' ){
                        $query->where('b.bannercatID', '=', $value);
                    }
                    if( $key == 'status' ){
                        $query->where('b.status', '=', $value);
                    }

                }
            }
        }   
        return $query; 
    }



function scopeGet_all_records2($query,$filterData, $per_page){ 
        //DB::enableQueryLog();
        $result = DB::table('banner as b')
                ->leftJoin('banner_category as bc', 'bc.bannercatID', '=', 'b.bannercatID')    
                ->select('*')           
                ->where( function ($query) use ($filterData){               
                    $this->get_filter_sql2($query, $filterData);
                 })         
                ->orderBy('b.bannercatID', 'ASC')
                ->paginate($per_page)
                ;
        //$result = DB::getQueryLog(); 
        //print_r($result);
        if( count($result) > 0 ){
            $result = $result;
        }
        else{
            $result = false;
        }       
        return $result;             

    }

1 个答案:

答案 0 :(得分:0)

您应该使用更多关系而不是原始数据库查询。但这取决于你。最后,使用Eloquent代码会更优雅。

我认为您的问题是您在匿名函数的位置使用$this而不是$query

->where( function ($query) use ($filterData){               
    $query->get_filter_sql2($query, $filterData);
})