V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iplayio2019
V2EX  ›  程序员

这样的 SQL 查询语句对于你们而言是常态吗?

  •  1
     
  •   iplayio2019 · 2020-05-27 16:34:08 +08:00 · 1389 次点击
    这是一个创建于 1646 天前的主题,其中的信息可能已经有所发展或是发生改变。
    $query = Student::from('student as s')
                ->join('user as u','u.object_id','=','s.id')
                //2020 年 2 月 28 日 08:12:41 新增添加下载证书次数
                ->leftjoin('check_result as cr','s.id','cr.student_id')
                //->leftJoin('classroom_member as cm','cm.user_id','=','u.id')
                //->leftJoin('classroom as c',function($join){
                ->join('classroom_member as cm','cm.user_id','=','u.id')
                ->join('classroom as c',function($join){
                    $join->on('c.id','=','cm.classroom_id')
                        ->where('c.status','<>',2);
                })
                ->when($year, function($query)use($year){
                    return $query->whereRaw('SUBSTRING(c.start_date,1,4) = '.$year);
                })
                ->where('s.is_delete', 0)
                ->where('u.status',0)
                ->when(get_user_school_id(),function($query)
                {
                    $query->where('c.school_id',get_user_school_id());
                })
                ->where('u.type',0) //学生
                ->when($search, function($query)use($search){
                    return $query->where(function($q)use($search){
                        $q->where('s.name','like',$search.'%')
                        ->orWhere('s.mobile','like',$search.'%');
                    });
                })
                ->orderBy('c.id','desc');
    
            $peixunrenci = $query->distinct('cm.id')->count('cm.id');
    
            $list = $query->groupBy('s.id')
                ->select(
                    's.id as stuid','s.name','s.sex','s.nation','s.mobile','s.id_card','s.work',
                    's.title','s.address', 's.email','s.office_phone','s.create_time','s.nation',
                    's.post_code',  'u.id as uid','cr.download_count'
                )
                ->addSelect(DB::raw('count(distinct(cm.id)) as count, max(c.start_date) as date'))
                ->paginate($pageSize);
    
    14 条回复    2020-05-28 10:10:06 +08:00
    cstj0505
        1
    cstj0505  
       2020-05-27 17:04:22 +08:00 via Android
    这是怎么构造出来的?明明一个串的事情,为啥要搞的这么复杂,好奇那些 sql 构造器的意义在哪。
    只是纯讨论下啊。
    6IbA2bj5ip3tK49j
        2
    6IbA2bj5ip3tK49j  
       2020-05-27 17:09:15 +08:00
    不写,也不会写这种 sql 。我们搞互联网的都是一把梭 load 内存慢慢筛的。/斜眼
    Jrue0011
        3
    Jrue0011  
       2020-05-27 17:09:42 +08:00
    看起来像是统计、报表之类的需求?
    zjsxwc
        4
    zjsxwc  
       2020-05-27 17:11:28 +08:00
    @cstj0505

    典型 builder 模式,只是比普通的直接 sql 字符串方便语言复用而已
    linxb
        5
    linxb  
       2020-05-27 17:13:04 +08:00
    这肯定不是常态啊,话说写成这样怎么维护跟优化啊
    zpfhbyx
        6
    zpfhbyx  
       2020-05-27 17:13:20 +08:00
    medoo 没那么多事
    cstj0505
        7
    cstj0505  
       2020-05-27 17:18:25 +08:00 via Android
    @zjsxwc 这算不算过度工程化?
    为了设计让代码根本不可读。
    dog82
        8
    dog82  
       2020-05-27 17:21:00 +08:00
    直接写一个 sql,不会用这种构造器,看得蛋疼
    miv
        9
    miv  
       2020-05-27 17:23:48 +08:00
    还不如一个 sql 清晰
    sockball07
        10
    sockball07  
       2020-05-27 17:27:11 +08:00
    太长了 说明需要注释 给出示例 sql
    weirdo
        11
    weirdo  
       2020-05-27 17:42:02 +08:00
    4 楼说的对,可读性和原生 sql 差不多,但是比直接使用 sql 方便,不需要用变量拼 sql,直接往对应函数填参数就好了
    iplayio2019
        12
    iplayio2019  
    OP
       2020-05-27 21:47:16 +08:00
    @zjsxwc 这种写法能复用在哪里,既不能随便加 HTTP 请求的参数,看起来也费劲。
    zjsxwc
        13
    zjsxwc  
       2020-05-27 22:59:54 +08:00 via Android
    @iplayio2019 #12 原文:“@zjsxwc 这种写法能复用在哪里,既不能随便加 HTTP 请求的参数,看起来也费劲。”

    回复:帖子里的例子当然没有体现复用了,最简单的复用场景是,比如你要根据一堆自定义的查询条件生产 sql 代码时,可以通过简单多次动态调用这个 builder 对象的方法,最终生成 sql,如果直接拼 sql 字符串的话自定义查询条件一多你就不得不写出一大堆冗余难以维护的 if 判断,这是前人踩坑后的教训,builder 模式也由此而来,应运而生。
    geligaoli
        14
    geligaoli  
       2020-05-28 10:10:06 +08:00
    sql 构造器,对于简单的是省事。对于复杂的语句,真没有原生 sql 好理解。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1348 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:42 · PVG 01:42 · LAX 09:42 · JFK 12:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.