Home > Net >  How to calculate using data from get() in controller
How to calculate using data from get() in controller

Time:12-31

I have some data from a table and I'm doing an eloquent get for it. So far from what I know is when using get(), I need to loop it first using foreach to get the data. My question is how to move my logic code to controller? so I just need to pass it to view. Because I'm doing it on blade directly

Bellow is my controller, I'm just simply get a data from database:

$attendances = Attendance::where('company_id', Auth::user()->company_id)->get();
@foreach ($attendances as $attendance)
  // How to move this php code to my controller?

  @php
    $work_hour_start = $attendance->work_hour_start;
    $attendance_time = \Carbon\Carbon::parse($attendance->attendance_time)->format('H:i:s');
    $tolerance = \Carbon\Carbon::parse($attendance_time)->addMinutes($attendance->late_tolerance);
    if ($tolerance > $work_hour_start) {
      $is_late = 'Late';
    } else {
      $is_late = 'On Time';
    }
  @endphp
  <tr>
    <td>{{ $attendance->employee->name }}</td>
    <td>{{ Carbon\Carbon::parse($attendance->attendance_time)->format('H:i:s') }}</td>
    <td>{{ $attendance->location_library->location_name }}</td>
    <td>{{ $is_late }}</td>
  </tr>   
@endforeach

I want my blade to be clean, but I don't know how to do that.

CodePudding user response:

You could add attendance_time to the $casts property and make tolerance/is_late accessors in the Attendance Model

# Attendance.php
class Attendance extends Model
{
    ...
    protected $casts = [
        'attendance_time' => 'datetime',
    ];
    ...
    public function getToleranceAttribute()
    {
        return $this->attendance_time->addMinutes($this->late_tolerance);
    }

    public function getIsLateAttribute()
    {
        return $this->tolerance > $this->work_hour_start
            ? 'Late'
            : 'On time';
    }
    ...
}
@foreach ($attendances as $attendance)
  <tr>
    <td>{{ $attendance->employee->name }}</td>
    <td>{{ $attendance->attendance_time->format('H:i:s') }}</td>
    <td>{{ $attendance->location_library->location_name }}</td>
    <td>{{ $attendance->is_late }}</td>
  </tr>   
@endforeach

CodePudding user response:

Just do it, move the logic to your controller and set it up in your $attendances collection. Something like this:

$attendances = Attendance::where('company_id', Auth::user()->company_id)->get();

foreach ($attendances as $key => $attendance){
    $attendances[$key]->attendance_time = \Carbon\Carbon::parse($attendance->attendance_time)->format('H:i:s');
    if (\Carbon\Carbon::parse($attendances[$key]->attendance_time)->addMinutes($attendance->late_tolerance > $attendance->work_hour_start) {
      $attendances[$key]->setAttribute('is_late', 'Late');
    } else {
      $attendances[$key]->setAttribute('is_late', 'On Time');
    }
}

return view('your-view', ['attendances' => $attendances]);

Now it will be able to iterate on your template:

@foreach ($attendances as $attendance)
  <tr>
    <td>{{ $attendance->employee->name }}</td>
    <td>{{ $attendance->attendance_time }}</td>
    <td>{{ $attendance->location_library->location_name }}</td>
    <td>{{ $attendance->is_late }}</td>
  </tr>   
@endforeach
  • Related