这样的 SQL 查询语句对于你们而言是常态吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
iplayio2019
V2EX    程序员

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

  •  1
     
  •   iplayio2019 2020-05-27 16:34:08 +08:00 1938 次点击
    这是一个创建于 2029 天前的主题,其中的信息可能已经有所发展或是发生改变。
    $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
    这肯定不是常态啊,话说写成这样怎么维护跟优化啊
    justseemore
        6
    justseemore  
       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     Solana     3148 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 12:15 PVG 20:15 LAX 04:15 JFK 07:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86