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

Laravel query builder inject column value into Carbon query

我有一个查询,我在我的项目中 运行 一个名为 Domain 的模型,它 returns 所有域的状态列匹配 完成 并且日期列早于或等于一组特定的天数。

我最近重构了模型列并包含了一个名为 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() 来使用原始数据库表达式,如果它 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)');
    

如果我正确理解您的问题,您可以在查询中使用 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');

  • 应使用 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();