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();
我有一个查询,我在我的项目中 运行 一个名为 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();