首页 > 解决方案 > 雄辩的 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)

标签: phplaraveleloquentphp-carbon

解决方案


根据给定的问题,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();
    }
}

推荐阅读