[英]Please How to convert this raw sql query to laravel eloquent or query builder?
[英]How to convert this raw sql query to laravel eloquent or query builder?
你好 Laravel 开发者,美好的一天。 请问如何将原始 sql 查询转换为 laravel 查询构建器或 eloquent ORM。我想生成出勤报告并使用 data.table 显示报告。我想显示每个员工的数据及其每日出勤日志。 我有两个表 employees 和 attendance_log,其中 attendance_log 属于 employees 表中的 emp_id。
我的问题是:
我无法在 laravel 查询生成器或 eloquent ORM 中编写此查询。
如何过滤或搜索data.table的数据?
$emp_id = $request->input('emp_id'); $start_date = $request->start_date; $end_date = $request->end_date; $data = DB::select(" SELECT emp.*, dep.department_name, al.emp_id, al.auth_date, min(al.auth_time) as 'check_in', max(al.auth_time) as 'check_out' FROM employees as emp LEFT JOIN attendance_log as al ON emp.device_emp_id = al.emp_id JOIN departments as dep ON emp.department_id = dep.id WHERE al.emp_id IN $emp_id // $emp_id is an array of employee's ID WHERE date(al.auth_date) BETWEEN $start_date AND $end_date GROUP BY emp.device_emp_id, date(al.auth_date_time) ");
用这种方法试试。 更多详情请查看: https://laravel.com/docs/8.x/queries
$query = DB::table('employees as emp')
->leftjoin('attendance_log as al','al.emp_id','emp.device_emp_id')
->join('departments as dep','dep.id','emp.department_id')
->select('emp.*', 'dep.department_name', 'al.auth_date' , DB::raw("MIN(al.auth_time) AS check_in, MAX(al.auth_time) AS check_out"))
->whereIn('al.emp_id', [1,2,3]) // use your array
->groupBy('emp.device_emp_id', DB::raw('DATE(al.auth_date_time)'));
if($start_date){
$query = $query->where('al.auth_date' , '>=' , $start_date);
}
if($end_date){
$query = $query->where('al.auth_date' , '<=' , $end_date);
}
$data = $query->get();
你可以使用DB::raw()
$data = DB::select(DB::raw("
SELECT
emp.*,
dep.department_name,
al.emp_id,
al.auth_date,
min(al.auth_time) as 'check_in',
max(al.auth_time) as 'check_out'
FROM employees as emp
LEFT JOIN attendance_log as al ON emp.device_emp_id = al.emp_id
JOIN departments as dep ON emp.department_id = dep.id
WHERE al.emp_id IN $emp_id // $emp_id is an array of employee's ID
WHERE date(al.auth_date) BETWEEN $start_date AND $end_date
GROUP BY emp.device_emp_id, date(al.auth_date_time)
"));
更新的答案
Employee::select(
'employees.*',
'departments.department_name',
'attendance_log.emp_id',
'attendance_log.auth_date',
'min(attendance_log.auth_time) as check_in',
'max(attendance_log.auth_time) as check_in'
)
->leftJoin('attendance_log', 'employees.emp_id', '=', 'attendance_log.emp_id')
->join('departments', 'employees.department_id', '=', 'departments.id')
->whereIn('attendance_log.emp_id', $emp_id)
->whereBetween("date('attendance_log.auth_date')", $start_date, $end_date)
->groupBy('employees.device_emp_id')
->groupBy('attendance_log.auth_date_time')
->get();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.