php - 雄辩的 whereDate 子句使用日期值作为列
问题描述
我正在尝试更新今天日期小于创建记录前 30 天的所有记录 + 持续时间值。例如
今天小于 created_at + 50(天) - 30 天通知期。
$subscriptions = Order::whereNotNull('service_id')->with('service')->get();
foreach($subscriptions as $subscription){
Order::where('id', $subscription->id)
->where(Carbon::today(), '<', Carbon::parse($subscription->created_at)->addDays($subscription->service->duration)->subDays(30))
->update(['status_id' => 7]);
}
我得到的错误是;
SQLSTATE[42S22]: Column not found: 1054 Unknown column '2020-08-21 00:00:00' in 'where clause' (SQL: update `orders` set `status_id` = 7
, `orders`.`updated_at` = 2020-08-21 21:01:58 where `id` = 3 and date(`2020-08-21 00:00:00`) < 2021-01-13)
解决方案
根据给定的问题,foreach 似乎不相关。
然后这是一种whereRaw()
在单个更新中实现它的方法,但功能(DATEDIFF,CURDATE)可能因数据库引擎而异,这里是 MySQL 变体:
Order::whereNotNull('service_id')
->with('service')
->whereRaw('DATEDIFF(CURDATE(), `order`.`created_at`) < `service`.`duration` - 30')
->update(['status_id' => 7]);
否则,您可以使用纯 PHP 语句而不是 where 子句一次更新 1 个订单:
foreach ($subscriptions as $subscription) {
if (Carbon::parse($subscription->created_at)->addDays($subscription->service->duration)->subDays(30) < Carbon::today()) {
$subscription->status_id = 7;
$subscription->save();
}
}
推荐阅读
- linux - 将第 n+1 行的列合并到第 n 行
- php - html中电话号码的正则表达式
- python - 最高效的 3sum 算法使用 python 进行 leetcode 挑战
- reactjs - React Redux this.props.getClasses 不是函数
- sql - Oracle SQL 小时 HH:MM:SS 中的日期之间的差异
- tomcat - 在 Openshift v3 Tomcat 映像中编辑 catalina.sh
- bootstrap-4 - Bootstrap 4 - 下拉值填充
- java - 在没有对象映射器的情况下将对象转换为 Jackson 中的 JSON 文件
- sql - 未实现匿名复合类型的输入 - Postgres
- angular - 无法以 Angular 4 提交表单