问题描述
我正在尝试更新所有日期,其中今天的日期少于创建记录之前的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();
}
}