【问题标题】:0000-00-00 as date in Laravel0000-00-00 作为 Laravel 中的日期
【发布时间】:2018-12-19 16:16:31
【问题描述】:

我必须在现有(旧)数据库上构建 Laravel 应用程序。此数据库使用 0000-00-00 作为默认日期。我无法更改它,因为当前系统(也将保留)使用它来检查某些东西是否在无限时间内处于活动状态(例如:active_from0000-00-00 & active_till0000 -00-00 表示它始终处于活动状态。

我想在现有表中添加一列,所以我创建了一个迁移:add_columnname_to_tablename_table。在up() 函数中我做了:$table->string('columnname')。当我运行迁移时,我得到:

SQLSTATE[22007]:日期时间格式无效:1292 日期时间不正确 值:'0000-00-00 00:00:00' 用于第 1 行的列 active_from

旧系统太大,无法对此进行任何更改——而且我无权更改它。

有没有办法让 Laravel 接受 0000-00-00 作为有效的日期(时间)?

【问题讨论】:

  • 默认值可以使用字符串,否则日期格式
  • disablingNO_ZERO_DATE sql_mode 在运行插入之前运行查询SET SESSION sql_mode = REPLACE(@@sql_mode. ',NO_ZERO_DATE'. ''); 可能有助于您的连接会话
  • 更改所有日期以更正日期值并将默认值设置为 current_value 或某个有效值

标签: php mysql database laravel eloquent


【解决方案1】:

这主要是一个 MySql 问题,因为较新版本的 MySql 禁用了零日期。此外,NO_ZERO_DATE 模式已被弃用(请参阅:https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_no_zero_date)。为了解决这个问题,您可以将数据库中的所有零日期更改为 unix 纪元时间1970-01-01 00:00:00(这是我在升级 MySql 后必须做的)。

【讨论】:

    【解决方案2】:

    Laravel 默认使用严格模式,我已通过将 config/database.php 中的 strict => true 更改为 strict => false 来解决此问题。

    【讨论】:

      【解决方案3】:

      strtotime 将在日期无效时返回一个小于零的数字,例如 MySQL 中常见的 0000-00-00 00:00:00。确保传递对象类型日期或碳:

        return strtotime(date or carbon object) < 0 ? null : date
      

      【讨论】:

        【解决方案4】:

        我发现你需要先将SQL列类型设置为TIMESTAMP,然后在存储数据时使用date()内置php函数

        $myModel->my_date = date('y-m-d');
        

        它将像created_atupdated_at一样以正确的格式保存。

        保存时的示例数据:

        "start_date": "2021-08-14 00:00:00",
        

        【讨论】:

          猜你喜欢
          • 2013-06-09
          • 2015-07-19
          • 1970-01-01
          • 1970-01-01
          • 2013-07-12
          • 2017-09-21
          • 1970-01-01
          • 1970-01-01
          • 2012-12-22
          相关资源
          最近更新 更多