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

2020-05-27 16:34:08 +08:00
 iplayio2019
$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);
1234 次点击
所在节点    程序员
14 条回复
cstj0505
2020-05-27 17:04:22 +08:00
这是怎么构造出来的?明明一个串的事情,为啥要搞的这么复杂,好奇那些 sql 构造器的意义在哪。
只是纯讨论下啊。
xgfan
2020-05-27 17:09:15 +08:00
不写,也不会写这种 sql 。我们搞互联网的都是一把梭 load 内存慢慢筛的。/斜眼
Jrue0011
2020-05-27 17:09:42 +08:00
看起来像是统计、报表之类的需求?
zjsxwc
2020-05-27 17:11:28 +08:00
@cstj0505

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

回复:帖子里的例子当然没有体现复用了,最简单的复用场景是,比如你要根据一堆自定义的查询条件生产 sql 代码时,可以通过简单多次动态调用这个 builder 对象的方法,最终生成 sql,如果直接拼 sql 字符串的话自定义查询条件一多你就不得不写出一大堆冗余难以维护的 if 判断,这是前人踩坑后的教训,builder 模式也由此而来,应运而生。
geligaoli
2020-05-28 10:10:06 +08:00
sql 构造器,对于简单的是省事。对于复杂的语句,真没有原生 sql 好理解。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/676030

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX