gpt4 book ai didi

php - Laravel Eloquent hasMany 按父表过滤

转载 作者:行者123 更新时间:2023-11-29 18:07:50 26 4
gpt4 key购买 nike

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

有 3 个表(简化):

用户
- id
- 姓名

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

用户离开
- 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 和关系,我确信答案并不遥远。

最佳答案

这是我的建议:

用户- ID- 姓名

user_leave_allowances- ID- 用户身份- 从- 到

用户离开- 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");

关于php - Laravel Eloquent hasMany 按父表过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47678511/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com