在我的系统中,有一些用户,每个用户每年都有假期津贴。
有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和人际关系,我确信答案并不太远。
答案 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");