模型和控制器查询以将 timein 和 timeout 与 codeigniter 中的单行合并

model and controller query to merge timein and timeout with single row in codeigniter

请教我如何实现这个(Codeigniter 框架) 请查看我想要实现的图像谢谢。 我也是 codeigniter 的新手,想了解答案。

enter image description here

这是我的数据库: enter image description here

型号 public 函数 get_attendance_employees() {

    $sql = 'SELECT * FROM tbl_employee';
    //$binds = array(1);
    $query = $this->db->query($sql);
    
    return $query;
}
public function attendance_first_in_check($userid,$attendance_date) {

    $sql = "SELECT * FROM tbl_employee_time_log as time_log WHERE userid = ? and substring(time_log.time,1,10) = ? and type = 'timein' limit 1";
    $binds = array($userid,$attendance_date);
    $query = $this->db->query($sql,$binds);

    return $query;
}
public function attendance_first_in($userid,$attendance_date) {

    $sql = "SELECT * FROM tbl_employee_time_log as time_log WHERE userid = ? and substring(time_log.time,1,10) = ? and type = 'timein'";
    $binds = array($userid,$attendance_date);
    $query = $this->db->query($sql, $binds);
    
    return $query->result();
}
public function attendance_first_out_check($userid,$attendance_date) {

    $sql = "SELECT * FROM tbl_employee_time_log as time_log WHERE userid = ? and substring(time_log.time,1,10) = ? and type = 'timeout' order by id desc limit 1";
    $binds = array($userid,$attendance_date);
    $query = $this->db->query($sql, $binds);
    
    return $query;
}
public function attendance_first_out($userid,$attendance_date) {

    $sql = "SELECT * FROM tbl_employee_time_log as time_log WHERE userid = ? and substring(time_log.time,1,10) = ? and type = 'timeout' order by id desc limit 1";
    $binds = array($userid,$attendance_date);
    $query = $this->db->query($sql, $binds);
    
    return $query->result();
}

控制器

public 函数 attendance_bio() {

    $session = $this->session->userdata('username');
    if(!empty($session)){ 
        $this->load->view("admin/timesheet/attendance_bio", $data);
    } else {
        redirect('admin/');
    }
    // Datatables Variables
    $draw = intval($this->input->get("draw"));
    $start = intval($this->input->get("start"));
    $length = intval($this->input->get("length"));
    
    $attendance_date2 = $this->input->get("attendance_date"); //string
    //$ref_location_id = $this->input->get("location_id");
    //$convert_atten = strtotime($attendance_date2); //int value
    //$attendance_date = $convert_atten->format('m-d-Y');
    $attendance_date = date("m-d-Y",strtotime($attendance_date2));
    //$timein = $this->Bio_model->get_attendance_date();
    //$timein = $this->Bio_model->get_attendance_timein($get_day);
    //$timein = $this->Bio_model->get_all();
    $employee = $this->Bio_model->get_attendance_employees();
    
    $data = array();
    //var_dump($attendance_date);
    foreach($employee->result() as $r){
            $check = $this->Bio_model->attendance_first_in_check($r->userid,$attendance_date);
            if($check->num_rows() > 0){
                    // check clock in time
                    $first_in = $this->Bio_model->attendance_first_in($r->userid,$attendance_date);
                    //$first_in2 = $first_in[0]->time->format('m-d-Y');
                    // clock in
                    $clock_in = new DateTime(strtotime($first_in[0]->time));
                    //$clock_in2 = $clock_in->format('H:i');
                    $clock_in2 = date_format($clock_in->time, 'H:i');
                    //$clock_in2 = var_dump($clock_in); 
                } else {
                    $clock_in2 = '-';
                    $clock_in = '-';
            }
            $check_out = $this->Bio_model->attendance_first_out_check($r->userid,$attendance_date);     
                if($check_out->num_rows() == 1){
                    
                    $first_out = $this->Bio_model->attendance_first_out($r->userid,$attendance_date);
                    //$first_out2 = $firs
                    $clock_out = new DateTime(strtotime($first_out[0]->time));
                    
                                if ($first_out[0]->time!='') {
                                    //$clock_out2 = $clock_out->format('H:i');
                                    //$clock_out2 = date('H:i',$clock_out);
                                    $clock_out2 = date_format($clock_out->time, 'H:i');
                                    } else {
                                        $clock_out2 =  '-';
                                    }
                }else {
                    $clock_out2 =  '-';
                    $clock_out = '-';
                }
                $data[] = array(
            $r->userid,
            $attendance_date,
            $clock_in2,
            $clock_out2,
        
        );
            
    }
  $output = array(
       "draw" => $draw,
         "recordsTotal" => $employee->num_rows(),
         "recordsFiltered" => $employee->num_rows(),
         "data" => $data
    );
  echo json_encode($output);
  exit();
 }

感谢您提供有关该主题的更多信息以及您目前尝试的代码。我提供了一个算法,我相信它对你有用。

控制器:

<?php namespace App\Controllers;

use App\Models\EmployeeTimeLog;

class Home extends BaseController
{
    public function index($employeeId)
    {
        // get all between dates
        $emplyeeModel = new EmployeeTimeLog();

        // get one week before today - for example
        $startDate = date("Y-m-d", strtotime("-1 week"));
        $endDate = date("Y-m-d");

        // get clock-in and clock-out for employee between dates
        $timeIn = $emplyeeModel->getTimeIn($employeeId, $startDate, $endDate)->getResult();
        $timeOut = $emplyeeModel->getTimeOut($employeeId, $startDate, $endDate)->getResult();

        $timeInIndex = 0;
        $timeOutIndex = 0;
        $output = [];
        $nextDate = $startDate;
        // loop through all the days between start and end date
        while($nextDate < $endDate){
            // get the lowest "timein" datetime which is the same date as the search date $nextDate
            $nextTimeIn = NULL;
            while($timeInIndex < count($timeIn) && date("Y-m-d", strtotime($timeIn[$timeInIndex]->Time)) == $nextDate){
                if(is_null($nextTimeIn)){
                    $nextTimeIn = $timeIn[$timeInIndex];
                }
                $timeInIndex ++;
            }

            // get the highest "timeout" datetime which is the same day as the search date $nextDate
            $nextTimeOut = NULL;
            while($timeOutIndex < count($timeOut) && date("Y-m-d", strtotime($timeOut[$timeOutIndex]->Time)) == $nextDate){
                $nextTimeOut = $timeOut[$timeOutIndex];
                $timeOutIndex ++;
            }

            // enter into a 2 dimentional array with
            // index 0 = timein
            // index 1 = timeout
            $output[] = [$nextTimeIn, $nextTimeOut];

            // get the next date
            $nextDate = date('Y-m-d', strtotime($nextDate. ' + 1 days'));
        }

        // return view with data
        return view('welcome_message', ["output" => $output]);
    }
}

型号:

<?php
namespace App\Models;

use CodeIgniter\Model;

class EmployeeTimeLog extends Model{

    private $tableName = "tbl_employee_time_log";

    public function __construct(){
        $db = \Config\Database::connect();
        $this->builder = $db->table($this->tableName);
    }

    private function timeData($employeeId, $startDate, $endDate){
        // builder function DRY
        $this->builder->where("EmployeeId", $employeeId);
        $this->builder->where("Time >", $startDate);
        $this->builder->where("Time <", $endDate);
        $this->builder->orderBy("Time", "ASC");
    }

    public function getTimeIn($employeeId, $startDate, $endDate){
        // call builder function and add timeIn to only get clock in times
        $this->timeData($employeeId, $startDate, $endDate);
        $this->builder->where("Type", "timein");
        return $this->builder->get();
    }

    public function getTimeOut($employeeId, $startDate, $endDate){
        // call builder function and add timeout to only get clock out times
        $this->timeData($employeeId, $startDate, $endDate);
        $this->builder->where("Type", "timeout");
        return $this->builder->get();
    }
}

?>

查看:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Timesheets</title>
    </head>
    <body>
        <h1>Timesheets</h1>

        <?php
        echo "<h1>Times</h1>";
        foreach ($output as $times) {
            echo "Time in: ";
            if(!is_null($times[0])){
                echo $times[0]->Time;
            }else{
                echo "-";
            }

            echo " Time out: ";
            if(!is_null($times[1])){
                echo $times[1]->Time;
            }else{
                echo "-";
            }
            echo "<br>";
        }
         ?>
    </body>
</html>

输出:

数据库:

整个算法的工作原理是搜索所提供日期的开始日期和结束日期之间的日期。然后,您可以检查与循环日期具有相同日期的任何时间输入和超时值。如果找不到日期,则默认为 NULL,在视图中用“-”替换。

算法专门获取员工最早的timein和最晚的timeout值。这意味着如果员工在一天内两次签到,将使用最早的日期,而签退则相反。

此算法专门适用于一名员工,但只需使用您的 select * 员工并循环遍历,而不是控制器上的 employeeId。您可能需要查看 CodeIgniter 中 Query Builder 的文档,它使查询数据库变得更加容易,并且会转义数据以防止 SQL 注入等

最好重新设计您的数据库 table 并检查插入而不是操作 select。每一天都有一行,timein 和 timeout 代表时间。像这样:

您可以检查日期是否已经存在,如果需要则覆盖当前值。如果该员工的当前日期不存在,则创建新记录。

如果您需要任何说明,请告诉我,

谢谢,