我有一个关于我的 Laravel 雄辩模型中范围定义的问题
情况: 模型是"订阅",它具有属性"开始日期"和"结束日期"。开始日期是必需的,结束日期是可选的填充或空
我定义了一个范围"活动",如下所示:
public function scopeActive($query)
{
return $query->whereDate('startdate', '<', Carbon::now())->whereDate('enddate', '>', Carbon::now());
}
正如您所看到的,当结束日期被填充时,这工作正常(将来的日期,但我如何添加我的开始日期早于今天并且结束日期为空的条件。
我认为有一个合适的解决方案,但我在文档中找不到它。
您可以使用:
public function scopeActive($query)
{
return $query->where(function($q) {
$q->where(function($q) {
$q->whereDate('startdate', '<', Carbon::now()->toDateString())
->whereDate('enddate', '>', Carbon::now()->toDateString());
})->orWhere(function($q) {
$q->whereDate('startdate', '<', Carbon::now()->toDateString())
->whereNull('enddate');
});
});
}
但由于在这两种情况下,开始日期都应该是过去,您可以使用:
public function scopeActive($query)
{
return $query->whereDate('startdate', '<', Carbon::now()->toDateString())
->where(function($q) {
$q->whereDate('enddate', '>', Carbon::now()->toDateString());
->orWhereNull('enddate');
});
});
}
你应该使用参数化的作用域
public function scopeActive($query, $param)
{
if(isset($param)) return $query->whereDate('startdate', '<', Carbon::now())->whereDate('enddate', '>', $param);
return $query->whereDate('startdate', '<', Carbon::now());
}
本地作用域