使用Eloquent

时间:2016-04-18 05:29:46

标签: php laravel eloquent

我有两个Eloquent模型,CampLevel

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));
}

1 个答案:

答案 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)"));
    })

}