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