繁体   English   中英

如何将此原始 sql 查询转换为 laravel eloquent 或查询生成器?

[英]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。

我的问题是:

  1. 我无法在 laravel 查询生成器或 eloquent ORM 中编写此查询。

  2. 如何过滤或搜索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) ");

我的 data.table 会像这张图片在此处输入图像描述

用这种方法试试。 更多详情请查看: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM