запрос модели и контроллера для объединения времени и времени ожидания с одной строкой в codeigniter

#codeigniter

#codeigniter

Вопрос:

Пожалуйста, научите меня, как я могу этого добиться (Codeigniter framework) Пожалуйста, посмотрите изображения, которые я хочу достичь, спасибо. и я также новичок в codeigniter и хочу понять ответ.

введите описание изображения здесь

Вот моя база данных: введите описание изображения здесь

общедоступная функция модели 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();
}
 

контроллер

общедоступная функция 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();
 }
 

Комментарии:

1. Вы попробовали, предоставили некоторый код, и мы можем рассказать вам, что происходит, вы ничему не научитесь, если кто-то сделает это за вас.

2. привет, Джек, спасибо за комментарий. Я отредактировал сообщение о кодах, которые у меня есть.

Ответ №1:

Благодарим вас за предоставление дополнительной информации по теме и коду, который вы пытались использовать до сих пор. Я привел алгоритм, который, как я полагаю, будет работать для вас.

Contoller:

 <?php namespace AppControllers;

use AppModelsEmployeeTimeLog;

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) amp;amp; 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) amp;amp; 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 AppModels;

use CodeIgniterModel;

class EmployeeTimeLog extends Model{

    private $tableName = "tbl_employee_time_log";

    public function __construct(){
        $db = ConfigDatabase::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, которое заменяется на «-» в представлении.

Алгоритм специально получает самое раннее время и самое последнее значение времени ожидания для сотрудника. Это означает, что если сотрудник регистрируется дважды за один день, будет использоваться самая ранняя дата, а для синхронизации — наоборот.

Этот алгоритм специально работает для одного сотрудника, но просто используйте select * employees и выполняйте цикл вместо EmployeeID на контроллере. Возможно, вы захотите посмотреть документацию для построителя запросов в CodeIgniter, это значительно упрощает запросы к базе данных и позволяет избежать данных для защиты от SQL-инъекций и т. Д.

Было бы лучше перепроектировать таблицу базы данных и проверить вставку, а не манипулировать при выборе. Где у вас есть одна строка на каждый день, а время и время ожидания представляют время. Что-то вроде этого:

введите описание изображения здесь

Вы можете проверить, существует ли уже дата, если это так, переопределите текущее значение, если это необходимо. Если текущая дата не существует для этого сотрудника, создайте новую запись.

Если вам нужны какие-либо разъяснения, дайте мне знать,

Спасибо,