雄辩的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();
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...