【问题标题】:How to get the supervisors that have approved all the submitted assessment如何获得已批准所有提交评估的主管
【发布时间】:2020-10-24 22:23:02
【问题描述】:

我正在使用 Laravel-5.8 开发一个项目

class Employee extends Model
{
   protected $table = 'employees';
   protected $primaryKey = 'id';

   protected $fillable = [
              'id',
              'fist_name',
              'last_name',
      'supervisor_id',
     ];

   public function assessment()
   {
        return $this->hasMany('App\Models\EmployeeAssessment', 'id', 'employee_id'); 
   }

   public function supervisor()
   {
       return $this->hasOne('App\Models\Employee', 'id', 'supervisor_id');
   }     
}


class Assessment extends Model
{
   protected $table = 'employee_assessments';

   protected $fillable = [
              'id',
              'employee_id',
              'is_submitted',
              'is_approved',
     ];

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

每个员工都有一个主管,主管会有多个员工向他汇报。 员工应提交评估,并由主管批准。如果员工提交了他的评估,那么 is_submitted 为 1,否则为 0。 主管只能批准提交的 (is_submitted = 1) 评估。当他批准时 is_approved 为 1。

$employees_that_submitted_assessment = Assessment::where('is_submitted', 1)->get();   //Note:If the submitted assessment approved, is_approved = 1 else 0 

$supervisor_completed_approvals = Employee::get();   

如何完成上面的查询来选择已批准所有提交评估的主管?

注意:All is:approved 必须为 1,其中 is_submitted 为 1 的员工附属于主管。

【问题讨论】:

  • 在员工模型检查 supervisor() 函数中.. 可以@mikefolu 吗?
  • @AbdullahAlNoor - 是的,检查 supervisor() 函数。每个员工都有一个主管

标签: laravel


【解决方案1】:

您可以使用查询生成器来实现此目的。我相信它看起来像这样:

Employee::query()
    ->whereNull('supervisor_id')
    ->whereNotIn('supervisor_id', function($query){
        $query->select('employee_id')
            ->from('employee_assignments')
            ->join('employee_assignments', 'employee.id', '=', 'employee_assignments.employee_id')
            ->where('employee_assignments.is_submitted', '=', 1)
            ->where('employee_assignments.is_approved', '=', 0);
    })->get();

这利用了子查询。子查询获取已提交但未批准分配的员工。然后,父查询会在子查询返回的列表中获取作为主管的员工(假设 null supervisor_id 表示该员工)以及不是员工的主管。

【讨论】:

    【解决方案2】:

    这样试试

    $employees_that_submitted_assessment = Assessment::with(['employee' => function($e)
    {
       $e->with('supervisor');
    }])
    ->where('is_submitted', 1)->get();
    

    你什么时候会 dd($employees_that_submitted_assessment );你会找到主管

    【讨论】:

      【解决方案3】:

      如果您需要跟踪该信息,您应该考虑将您的 is_approved 列更改为approved_by,因为我想员工将来可能会更换主管。

      在这种情况下,您可以添加以下关系

      Employee.php

          public function supervised()
          {
              return $this->hasMany(Employee::class, 'superviser_id');
          }
      
          public function approvals()
          {
              return $this->hasMany(Assessment::class, 'approved_by');
          }
      
          public function supervisedAssessments()
          {
              return Assessment::whereHas('employee.supervisor' function ($query) {
                  $query->where('id', $this->id);
              })->get();
          }
      
          public function pendingApprovals()
          {
              return Assessment::whereNull('approved_by')
                         ->where('is_submitted', 1)
                         ->whereHas('employee.supervisor' function ($query) {
                             $query->where('id', $this->id);
                         })->get();
          }
      
          public function approve(Assessment $assessment)
          {
              $assessment->approved_by = $this->id;
              $assessment->save();
          }
      

      评估.php

          public function approvedBy()
          {
              return $this->belongsTo(Employee::class, 'approved_by')
          }
      

      现在您可以使用任何您喜欢的逻辑来批准评估,如下所示:

      foreach ($supervisor->pendingAssessments() as $assessment) {
          $supervisor->approve($assessment);
      }
      

      【讨论】:

        【解决方案4】:

        您必须正确设计您的 Eloquent 模型关系。如我所见,您没有提供 EmployeeAssessment 和 Supervisor 对象之间的关系。根据您的评估场景,主管至少可以进行一次员工评估,并且多次评估必须由主管处理。所以我们在 Supervisor 和 EmployeeAssessment 之间存在一对多的关系。

        你需要考虑这样的事情:

        1. Eloquent 模型关系

          class Supervisor extends Model{
              public function employeeAssessment(){
                  return $this->hasMany('App\EmployeeAssessment');
              }            
           }
          
          class EmployeeAssessment extends Model{
              public function supervisor(){
                  return $this->belongsTo('App\Supervisor');
              }            
           }
          
        2. 控制器

              $supervisors = Supervisor::with('employeeassements', 'employee')->orderBy('id', 'desc')->limit(25)->get(); //if you want to limit 25 assessments per query
          
        3. 查看

          @if(!empty($supervisors))
              //traverse the assessment by supervisor with nested loops
              @foreach($supervisors as $supervisor){
          
                  @foreach($supervisor->employeeassements as $assessment){
                    //some extra code here using $assessment object
          
                   //count the suppervisors here
                   ({{ count(($supervisor->employeeassements) }})
                  }
              }
          @endif
          

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-08
          • 2019-09-29
          • 2019-01-18
          • 2019-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多