我有一个查询,我在一个名为Domain
的模型上运行我的项目,它返回所有域,其中域的状态列匹配完整日期列在或等于一组特定日期之前。
我最近重构了模型列,并包含了一个名为domain_alert_period
的新列,这是一个整数列,以天为单位保存值,我需要以某种方式针对此列并将其替换为现有的30这样用户就可以控制收到警报的天数。
为了实现这个目标,我错过了什么?
return Domain::where('status', 'complete')
->where(function ($sql) {
$sql->where('domain_expires_on', '>', Carbon::now()->subDays(2)) // 2 days after expiry
->where('domain_expires_on', '<', Carbon::now()->addDays(30)); // 30 days before expiry
})
->get();
我相信你可以在你的子句中使用whereRaw()
来使用原始DB表达式,如果它是MySQL,你可以使用DATE_ADD
方法与你的列值进行比较
$sql->where('domain_expires_on', '>', Carbon::now()->subDays(2)) // 2 days after expiry
->whereRaw('domain_expires_on < DATE_ADD(NOW(), INTERVAL domain_alert_period DAY)');
-
应该使用mysql DATE_SUB函数从
开始发出警告的日期domain_expires_on
日期中减去天数。这就是你应该从 -
然后匹配大于或等于警报日期的当前日期
$query = $this->model ->whereRaw('CURDATE() <= DATE_ADD(`domain_expires_on` , INTERVAL 2 DAY)') // till 2 days after expiry ->whereRaw('CURDATE() >= DATE_SUB(`domain_expires_on` , INTERVAL domain_alert_period DAY)') ->get();
如果我正确理解你的问题,你能做的就是在你的查询中使用use ($var)
来代替30
$start=1; //you can also take date from user for between like `date_from` and `date_to` and parse them with Carbon insted of adding or substracting days from now()
$end=30;
return Domain::where('status', 'complete')
->where(function ($sql) use ((int) $start,(int) $end) {
$sql->whereDate('domain_expires_on', '>', Carbon::now()->subDays($start)->toDateString())
->whereDate('domain_expires_on', '<', Carbon::now()->addDays($end)->toDateString());
})
->get();
另外,如果您只存储domain_expires_on
作为日期,则应该设置碳日期的格式以匹配您的数据库格式。
以上方法将适用于$table->date('domain_expires_on');
和$table->dateTime('domain_expires_on');