我有两个Eloquent模型,Camp
和Level
。
Camp
有一个start
和一个end
日期字段。
Level
有一个min_age
和一个max_age
整数字段。
一个Level
与许多Camps
使用查询范围和日期参数$dob
,我想获取一个Camp
的集合,其中$dob
上出生的人的年龄将介于min_age
之间}和max_age
日期start
。
换句话说(一些伪代码):
select * from Camps
join Levels on Camps.level_id = Levels.id
where min_age <= (start - $dob)->toYears <= max_age
这样的事情是否可以使用查询范围,也许不使用任何原始查询?也许是这样的?
public function scopeAgeAppropriate($query, $dob) {
return $query->join('Levels', 'Camps.level_id', '=' ,'Levels.id')
->where('min_age', '<=', start->diffInYears($dob))
->where('max_age', '>=', start->diffInYears($dob));
}
答案 0 :(得分:1)
查询关系whereHas()
并使用TIMESTAMPDIFF
动态计算年龄:
您的范围将是:
public function scopeAgeAppropriate($query, $dob) {
return $query->whereHas('levels',function($q) use ($dob) {
return $q->where('min_age', '<=', \DB::raw("TIMESTAMPDIFF(YEAR, '{$dob}', Camps.start)"))
->where('max_age', '>=', \DB::raw("TIMESTAMPDIFF(YEAR, '{$dob}', Camps.start)"));
})
}