Php 在查询范围中使用计算值

Php 在查询范围中使用计算值,php,laravel,eloquent,Php,Laravel,Eloquent,我有两个雄辩的模型,Camp和Level Camp有一个start和一个end日期字段 级别有一个最小年龄和一个最大年龄整数字段 一个级别与许多营地 使用查询范围和日期参数$dob,我想获取Camps的集合,其中$dob出生的人的年龄将在开始日期的最小年龄和最大年龄之间 换句话说(一些伪代码): 从营地中选择* 在Camps.level_id=Levels.id上加入级别 最小年龄到年加入的位置('Levels','Camps.level_id','=','Levels.id')) ->其中('

我有两个雄辩的模型,
Camp
Level

Camp
有一个
start
和一个
end
日期字段

级别
有一个
最小年龄
和一个
最大年龄
整数字段

一个
级别
与许多
营地

使用查询范围和日期参数
$dob
,我想获取
Camp
s的集合,其中
$dob
出生的人的年龄将在
开始日期
最小年龄
最大年龄
之间

换句话说(一些伪代码):

从营地中选择*
在Camps.level_id=Levels.id上加入级别
最小年龄到年加入的位置('Levels','Camps.level_id','=','Levels.id'))
->其中('min_age','=',start->diffInYears($dob));
}

通过关系查询
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)"));
    })

}
公共函数作用域合适($query,$dob){
return$query->whereHas('levels',function($q)use($dob){
返回$q->where('min_age','=',\DB::raw(“TIMESTAMPDIFF(YEAR,{$dob}',Camps.start)”);
})
}

OP在数据库中不清楚,但我很确定,在获取模型时,Postgres适配器会运行
EXISTS
查询。这意味着,
Camps
将无法查询,除非我遗漏了什么?请让我知道
whereHas
使用子选择查询检查关系,因此
Camps
表将可供参考。当然可以。出于某种原因,我认为exists子查询没有访问父查询列的权限。不知道我在想什么。这对我来说很有效。我必须在MySQL的{$dob}周围添加单引号(我应该指定)以接受查询。我希望有一个解决方案,可以不使用原始查询和碳库来计算时间差,但这已经足够了。非常感谢。
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));
}
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)"));
    })

}