不同的SQL查詢場景在不同的框架里都有各自的風格來快速實現,YII里用的是 new CDbCriteria的方式來組裝sql,Laravel有when方法來判斷滿足
源碼路徑:vendor\laravel\framework\src\Illuminate\Database\Concerns\BuildsQueries.php,分析源碼可以得出:when會判斷第一個參數的真與假,如果是真,則執行第一個callback,如果是假,則執行默認的方法
/** * Apply the callback's query changes if the given "value" is true. * * @param mixed $value * @param callable $callback * @param callable $default * @return mixed */ public function when($value, $callback, $default = null) { if ($value) { return $callback($this, $value) ?: $this; } elseif ($default) { return $default($this, $value) ?: $this; } return $this; }
舉例一(if else )
$data = $obj->DB::connection('mysql')->table('test') ->where('membership_openid', '=', $wxOpenId) ->where('start_time', '>=', $start_time) ->groupBy('business_name','business_id') ->when($params['type'] == 1,function ($query){ $query->orderBy('account', 'desc')->orderBy('times', 'desc');//如果成立 },function ($query){ $query->orderBy('times', 'desc')->orderBy('account', 'desc');//否則 }) ->limit(5) ->get();
舉例二(use )
$data = DB::connection('mysql_snj_paike')->table('class_stage_subject_teacher as a') ->leftJoin('order_class_stage_subject as b', function($join){ $join->on('a.class_id', '=', 'b.class_id') ->on('a.stage_id', '=', 'b.stage_id') ->on('a.subject_id', '=', 'b.subject_id') ->on('a.batch_num', '=', 'b.batch_num'); }) ->where('a.ID', '=', $csstId) ->Join('order_info as c', 'b.order_no', '=', 'c.order_no') ->select(['a.id as object_id', 'a.TEACHER_STAFF_NO as staff_no', 'c.STUDENT_ID as student_id']) ->where('c.ORDER_STATE', '<>', 7) ->groupBy('a.id', 'a.TEACHER_STAFF_NO', 'c.STUDENT_ID') ->when($pageInfo,function ($query) use ($pageInfo){ //use 這里使用的是一個數組變量 $query->limit($pageInfo['pageSize'])->offset(($pageInfo['pageNum']-1)*$pageInfo['pageSize']); }) ->orderBy('a.id', 'DESC') ->get() ->toArray();