【问题标题】:Eloquent whereDate clause using date value as a column雄辩的 whereDate 子句使用日期值作为列
【发布时间】:2020-08-21 21:38:16
【问题描述】:

我正在尝试更新今天日期小于创建记录前 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)

【问题讨论】:

  • 调用whereDate时需要指定列。试试-&gt;whereDate('created_at', ...
  • 那么在这种情况下我必须使用'where',因为我不想比较列值?
  • 不,只需将日期列的名称添加为第一个参数:whereDate('created_at', '&lt;', '2020-08-21 00:00:00')
  • 我没有比较查询中的日期列?
  • @DigitalDrifter 是的,+ 50 (days) - 30 day 您不能按照说明附加到列名。如果您认为自己有一些可行的方法,我们非常欢迎您提交问题的答案。

标签: php laravel eloquent php-carbon


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多