Laravel查询生成器将列值注入到Carbon查询中



我有一个查询,我在一个名为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');

最新更新