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

0
aulyndhan 14 Янв 2021 в 04:38

1 ответ

Лучший ответ

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

Контроллер:

<?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>

Выход:

enter image description here

База данных:

enter image description here

Весь алгоритм работает путем поиска даты между начальной и конечной датами предоставленных дат. Затем вы можете проверить любые значения тайм-аута и тайм-аута, которые имеют ту же дату, что и дата цикла. Если дату не удается найти, по умолчанию используется значение NULL, которое в представлении заменяется знаком «-».

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

Этот алгоритм специально работает для одного сотрудника, но просто используйте выбранных * сотрудников и выполните цикл вместо employeeId на контроллере. Вы можете посмотреть документацию по Query Builder в CodeIgniter, который позволяет запрашивать база данных намного проще и позволит избежать данных для защиты от SQL-инъекций и т. д.

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

enter image description here

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

Если вам нужны пояснения, дайте мне знать,

Благодарность,

0
Jack Dane 23 Янв 2021 в 01:38