如何使用Laravel为特定员工生成请假余额表

问题描述 投票:0回答:2

在我的Laravel-5.8项目中,当一名员工登录时,我想要显示一个如下所示的表,该表显示了他的请假余额

leave balance

我有3个适用的表

class LeaveCategory extends Model
{
   protected $table = 'leave_categories';

   protected $fillable = [
              'leave_category_name',
          ];

   public function leavecategorydetail()
   {
       return $this->hasMany('App\Models\LeaveCategoryDetail');
   }  
}

class LeaveCategoryDetail extends Model
{
   protected $table = 'leave_category_details';
   protected $fillable = [
              'id',
              'leave_category_id',
              'employment_type_id',
              'no_of_days',
          ];

   public function leavecategory()
   {
       return $this->belongsTo('App\Models\LeaveCategory', 'leave_category_id', 'id');
   }

   public function employmenttype()
   {
       return $this->belongsTo('App\Models\EmploymentType', 'employment_type_id', 'id' );
   }    
}

class LeaveRequest extends Model
{
   protected $table = 'leave_requests';
   protected $fillable = [
              'id',
              'employee_id',
              'leave_category_id',
              'leave_status',
              'approved_days',
          ];


   public function employee()
   {
       return $this->belongsTo('App\Models\Employee','employee_id');
   }    

   public function leavetype()
   {
       return $this->belongsTo('App\Models\LeaveCategory','leave_category_id');
   }
}

如前所述,预期结果将有4列(离开类别,适用假期,批准假期可用)

控制器

public function leave_balance()
{
    $userId = Auth::user()->id;
$userCompany = Auth::user()->company_id;
$employmentcategory = Employee::select('employeement_category_id')->where('employee_id', $userId)->where('is_active', 1)->first();

//Leave Category
$leavecategories = LeaveCategory::select('leave_category_name')->where('company_id', $userCompany)->get();

//Applicable Leave
    $applicableleaves = DB::table('leave_categories')
             ->join('leave_category_details', 'leave_category_details.leave_category_id', '=', 'leave_categories.id')
             ->select('leave_category_details.no_of_days')
             ->where('leave_categories.company_id', $userCompany)
             ->where('leave_categories.employment_category_id',$employmentcategory)
             ->get(); 

//Approved Leave
    $approvedleaves = DB::table('leave_requests')
             ->select('employee_id','leave_category_id', DB::raw('SUM(approved_days) AS approvedLeave'))
             ->where('employee_id', $userId)
     ->where('leave_category_id', $employmentcategory)
             ->where('leave_status',4)
             ->groupBy('employee_id', 'leave_category_id')
             ->get(); 

//Available
$availableleaves = $applicableleaves - $approvedleaves

   $leavebalances = ...

return view('leave-balances')
    ->with('leavebalances', $leavebalances)
}

我如何将控制器中的四个查询($ leavecategories,$ applicableleaves,$ approvedleaves,$ availableleaves)合并为$ leavebalances,并得到类似的视图

请参见请假余额图像

            <thead>
                <tr>
                    <th width="55%">
                        Leave Category
                    </th>
                    <th width="15%">
                        Applicable Leave
                    </th>
                    <th width="15%">
                        Approved Leave
                    </th>
                    <th width="15%">
                        leavebalances
                    </th>                        
                </tr>
            </thead>
            <tbody>      
                <!--start foreach-->
                    <td>

                    </td> 
                    <td>

                    </td>      
                    <td>

                    </td> 
                    <td>

                    </td>                           
                <!--end foreach-->

如果没有$ approvedleaves的字段/值,则应以0初始化

谢谢。

laravel
2个回答
0
投票
兄弟,您可以尝试在一个查询中进行两个查询虽然不完美,但您了解了

$all = DB::table('leave_category_details') ->leftJoin('leave_categories', function($join) { $join->on('leave_categories.id', '=', 'leave_category_details.leave_category_id'); $join->on('leave_categories.employment_category_id',$employmentcategory); $join->on('leave_categories.company_id','=', $userCompany); }) ->leftJoin('leave_requests', function($join) { $join->on('leave_requests.employee_id', '=', $userId); $join->on('leave_requests.leave_category_id', $employmentcategory); $join->on('leave_status',4); }) ->groupBy('leave_requests.employee_id', 'leave_requests.leave_category_id') ->select('leave_category_details.no_of_days','leave_requests.employee_id','leave_requests.leave_category_id', DB::raw('SUM(leave_requests.approved_days) AS approvedLeave'),DB::raw('SUM(leave_requests.approved_days) - leave_category_details.no_of_days AS availableleaves') ->get();


0
投票
为什么要在一个查询中同时获得每一列,为什么呢?

我这样调整了您的控制器:

public function leave_balance() { $userId = Auth::user()->id; $userCompany = Auth::user()->company_id; $employmentCategoryId = Employee::where('employee_id', $userId)->where('is_active', 1)->value('employeement_category_id'); //Leave Table $leaveTable = DB::table('leave_categories as lc') ->join('leave_category_details as lcd', 'lcd.leave_category_id', '=', 'lc.id') ->join('leave_requests as lr', 'lr.leave_category_id', '=', 'lc.id') ->select('lcd.no_of_days as applicableLeaves ','lc.leave_category_name as leaveCategory',DB::raw('SUM(lr.approved_days) AS approvedLeaves')) ->where([ ['lc.company_id', $userCompany], ['lc.employment_category_id',$employmentCategoryId], ['lr.employee_id', $userId], ['lr.leave_status',4] ]) ->groupBy('leaveCategory', 'applicableLeaves') ->get(); return view('leave-balances') ->with('leaveTable', $leaveTable) }

[$availableleaves可以在视图中计算,无需发送。

现在在您的视图中,您将像这样显示它们:

<thead> <tr> <th width="55%"> Leave Category </th> <th width="15%"> Applicable Leave </th> <th width="15%"> Approved Leave </th> <th width="15%"> leavebalances </th> </tr> </thead> <tbody> @foreach ($leaveTable as $tableRow) <tr> <td> {{$tableRow->leaveCategory}} </td> <td> {{$tableRow->applicableLeaves}} </td> <td> @if(!$tabelRow->approvedLeaves->isEmpty()){{$tabelRow->approvedLeaves}}@else 0 @endif </td> <td> {{($tableRow->applicableLeaves - $tabelRow->approvedLeaves)}} </td> </tr> @endforeach </tbody>

HTML不是我最擅长的领域,因此您的表可能无法按需显示,但我认为一切都很好。
© www.soinside.com 2019 - 2024. All rights reserved.