Laravel5版本在sql查询时用when方便条件判断查询【闭包方式】

不同的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();
复制代码

 

posted @   温柔的风  阅读(999)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示