请求将指定MySQL查询语句转换为Laravel模型查询实现
请求将指定MySQL查询语句转换为Laravel模型查询实现
嘿,我来帮你把这条MySQL查询转换成Laravel Eloquent查询构建器的写法,完美匹配原SQL的逻辑,同时贴合Laravel的开发习惯~
首先先明确对应的模型假设(你可以根据自己实际的模型名称调整):
user_personal表对应UserPersonal模型clockin表对应Clockin模型schedule_week表对应ScheduleWeek模型
下面是转换后的代码实现,每一步都严格对应原SQL的逻辑:
use App\Models\UserPersonal; use Illuminate\Support\Facades\DB; $attendanceRecords = UserPersonal::query() // 选择需要的字段,对应原SQL的SELECT部分 ->select([ 'clockin.working_day as cdate', DB::raw('clockin.*'), // 原SQL里的`clockin.`推测是要选中该表所有字段,这里补全 DB::raw('sch_week.*'), // 同理,原SQL的`sch_week.`补全为所有字段 'user_personal.schedule_id', 'user_personal.username', // 处理子查询:拼接同一员工同一天的时间记录 DB::raw("( SELECT GROUP_CONCAT(time separator '==') FROM clockin WHERE employee_no = user_personal.employee_no AND working_day = clockin.working_day GROUP BY working_day ) as time") ]) // 处理JOIN关联:先关联clockin,再嵌套关联schedule_week ->join('clockin', function ($join) { $join->join('schedule_week as sch_week', function ($innerJoin) { $innerJoin->on('user_personal.schedule_id', '=', 'sch_week.schedule_id') ->whereRaw('sch_week.week_day = DATE_FORMAT(clockin.working_day, "%a")'); }); }) // 筛选当月的记录 ->whereRaw('MONTH(clockin.working_day) = MONTH(CURRENT_DATE())') // 按员工编号和工作日分组 ->groupBy('user_personal.employee_no', 'clockin.working_day') // 排序规则:工作日倒序,员工编号正序 ->orderBy('clockin.working_day', 'desc') ->orderBy('user_personal.employee_no') // 获取结果集 ->get();
一些关键点说明:
- 原SQL里的
clockin.和sch_week.应该是输入时的遗漏,我默认处理为选中对应表的所有字段,如果只需要特定字段,把DB::raw('clockin.*')换成具体字段名即可 - 子查询用
DB::raw()直接保留原生逻辑,因为GROUP_CONCAT是MySQL专属函数,用原生表达式最直接高效 - 关联部分用嵌套的
join来实现原SQL里的连续JOIN逻辑,确保关联条件完全匹配 - 月份筛选用
whereRaw()来和原SQL的month()函数逻辑保持一致
备注:内容来源于stack exchange,提问作者Sonali
相关产品推荐
相关产品推荐

