$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);
1
cstj0505 2020-05-27 17:04:22 +08:00 via Android
这是怎么构造出来的?明明一个串的事情,为啥要搞的这么复杂,好奇那些 sql 构造器的意义在哪。
只是纯讨论下啊。 |
2
6IbA2bj5ip3tK49j 2020-05-27 17:09:15 +08:00
不写,也不会写这种 sql 。我们搞互联网的都是一把梭 load 内存慢慢筛的。/斜眼
|
3
Jrue0011 2020-05-27 17:09:42 +08:00
看起来像是统计、报表之类的需求?
|
5
linxb 2020-05-27 17:13:04 +08:00
这肯定不是常态啊,话说写成这样怎么维护跟优化啊
|
6
zpfhbyx 2020-05-27 17:13:20 +08:00
|
8
dog82 2020-05-27 17:21:00 +08:00
直接写一个 sql,不会用这种构造器,看得蛋疼
|
9
miv 2020-05-27 17:23:48 +08:00
还不如一个 sql 清晰
|
10
sockball07 2020-05-27 17:27:11 +08:00
太长了 说明需要注释 给出示例 sql
|
11
weirdo 2020-05-27 17:42:02 +08:00
4 楼说的对,可读性和原生 sql 差不多,但是比直接使用 sql 方便,不需要用变量拼 sql,直接往对应函数填参数就好了
|
12
iplayio2019 OP @zjsxwc 这种写法能复用在哪里,既不能随便加 HTTP 请求的参数,看起来也费劲。
|
13
zjsxwc 2020-05-27 22:59:54 +08:00 via Android
@iplayio2019 #12 原文:“@zjsxwc 这种写法能复用在哪里,既不能随便加 HTTP 请求的参数,看起来也费劲。”
回复:帖子里的例子当然没有体现复用了,最简单的复用场景是,比如你要根据一堆自定义的查询条件生产 sql 代码时,可以通过简单多次动态调用这个 builder 对象的方法,最终生成 sql,如果直接拼 sql 字符串的话自定义查询条件一多你就不得不写出一大堆冗余难以维护的 if 判断,这是前人踩坑后的教训,builder 模式也由此而来,应运而生。 |
14
geligaoli 2020-05-28 10:10:06 +08:00
sql 构造器,对于简单的是省事。对于复杂的语句,真没有原生 sql 好理解。
|