【问题标题】:How to update ends_at field of laravel cashier如何更新laravel收银员的ends_at字段
【发布时间】:2020-11-27 18:04:33
【问题描述】:

我想更新订阅表的 ends_at 列。当我使用

Carbon::now()

完美更新但何时使用

Carbon::now()->addCenturies(5);

我面临错误

SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2520-08-07 11:39:13' for column 'ends_at' at row 1 (SQL: update `subscriptions` set `ends_at` = 2520-08-07 11:39:13, `subscriptions`.`updated_at` = 2020-08-07 11:39:13 where `id` = 1)

我想要一个终身订阅,因为我认为增加了几个世纪。 kinldy 告诉我解决方案我的控制器代码是

  $subscription = $user->newSubscription('default', $plan->plan_id)->create($request->paymentMethod, [ 'email' => $user->email ]); 
                $subscription->ends_at = Carbon::now()->addCenturies(5);
                $subscription->save();

【问题讨论】:

  • TIMESTAMP 数据类型用于同时包含日期和时间部分的值。 TIMESTAMP 的范围为 '1970-01-01 00:00:01' UTC'2038-01-19 03:14:07' UTC。您给定的年份是 2520 并且您的 MySQL 可以将年份处理为最大值 2038
  • 可以,如果你使用DATETIME,它支持的范围是'1000-01-01 00:00:00''9999-12-31 23:59:59'。而TIMESTAMP 的范围为'1970-01-01 00:00:01' UTC'2038-01-19 03:14:07' UTCdev.mysql.com/doc/refman/8.0/en/datetime.html
  • 如果您使用的是$table->timestamp('ends_at');,请将其更改为$table->dateTime('ends_at');
  • 解决了你的问题?
  • 是的,再次感谢,我稍后进行迁移并且工作正常

标签: laravel stripe-payments laravel-cashier


【解决方案1】:

看起来 ends_at 应该是 Laravel Cashier 的 managed for you,而不是你手动修改的东西。查看source code,它只根据其他值更新,而不是任何参数。它也不用于设置 Stripe API 请求中的任何参数。 cancel_at parameter 似乎很可能是映射。

如果你想设置cancel_at,它需要一个纪元时间戳(以秒为单位)。正如上面@sta所说,这个有最大值2147483647,代表a time in 2038

另请注意,默认情况下订阅将永久持续,因此无需设置 5 个世纪后的“结束日期”。

【讨论】:

    【解决方案2】:

    TIMESTAMP 数据类型用于同时包含日期和时间部分的值。 TIMESTAMP 的范围为 1970-01-01 00:00:01 UTC2038-01-19 03:14:07 UTC。您给定的年份是2520,而您的 MySQL 可以将年份处理为最大 2038
    将迁移 timestamp 更改为 dataTime 格式为:

    $table->timestamp('ends_at');
    

    $table->dateTime('ends_at');
    

    【讨论】:

      猜你喜欢
      • 2019-01-08
      • 2015-04-28
      • 2014-10-28
      • 2018-03-28
      • 2018-06-17
      • 1970-01-01
      • 2022-11-18
      • 2015-10-04
      • 2021-02-26
      相关资源
      最近更新 更多