Laravel Eloquent hasMany按父表过滤

时间:2017-12-06 15:59:09

标签: php mysql laravel

在我的系统中,有一些用户,每个用户每年都有假期津贴。

有3个表格(简化):

用户
- id
- 姓名

user_leave_allowances
- id
- user_id
- 来自 - 到 - 津贴

user_leave
- id
- user_id
- 来自 - 到 - 天

在UserLeaveAllowance模型中,我设置了以下关系:

public function leave(){
    return $this->hasMany('App\UserLeave','user_id','user_id');
}

通过以下方式检索休假津贴:

$leaveAllowance = UserLeaveAllowance::with(['leave'])
->where('user_id',$id)
->get()

这会为该用户提供完整的休假限额清单(user_leave_allowances)以及他们当前请求的所有休假(user_leave)。

但是,津贴将适用于不同的时间段,例如2017年1月1日至2017年12月31日之间的休假将被取消。因此,对于每个休假津贴期间,我只想要在这两个日期(从&到)的休假,此时它只是将该用户的所有休假拉到每个休假津贴。

我尝试了很多不同的方法,使用hasMany上的where条件......

public function used(){
    return $this->hasMany('App\UserLeave','user_id','user_id')
->where('from', '>=', 'user_leave_allowances.from')
->where('to', '<=', 'user_leave_allowances.to');
}

public function used(){
    return $this->hasMany('App\UserLeave','user_id','user_id')
->whereRaw('user_leave.from >= user_leave_allowances.from')
->whereRaw('user_leave.to <= user_leave_allowances.to');
}

但我无法弄清楚如何让它发挥作用。我对Laravel来说相当新,并试图掌握Eloqent和人际关系,我确信答案并不太远。

1 个答案:

答案 0 :(得分:0)

这是我的建议:

用户 - ID - 姓名

<强> user_leave_allowances - ID - 用户身份 - 从 - 到

<强> user_leave - ID - user_leave_allowances_id - 从 - 到

简而言之,请将您的假期与您的假期津贴而不是用户直接联系起来,因为从本质上讲,请假的请求不是直接从用户那里取出。

class User extends Model {
     public leaveAllowance() {
         return $this->hasMany(UserLeaveAllowance::class);      
     }        
} 

class UserLeaveAllowance {
      public user() { return $this->belongsTo(User::class); }
      public leaveRequests() { 
        return $this->hasMany(UserLeave::class);
      }
}

class UserLeave {
      public allowancePeriod() { 
        return $this->belongsTo(UserLeaveAllowance::class);
      }
} 

现在你可以做以下事情:

UserLeaveAllowance::whereHas("user", function ($q) { 
        return $q->where("id", <user id>); //Allowances for this user
})->leaveRequests() 
->selectRaw("SUM(TIMESTAMPDIFF(DAY, to, from)) as days")
->value("days");