Doctrine/dbal - 尝试将字符串字段更改为日期时出错

Posted

技术标签:

【中文标题】Doctrine/dbal - 尝试将字符串字段更改为日期时出错【英文标题】:Doctrine/dbal - Got error when try to change a string field to date 【发布时间】:2020-04-10 21:21:49 【问题描述】:

我使用 Laravel 迁移创建了一个表。我将两个字段作为字符串迁移,但我想要一个作为日期,一个作为整数。所以我创建了一个新的迁移来更改这些字段。我安装了学说/dbal。我使用 Laravel 6.5。但是,我在尝试迁移时遇到了错误。

迁移

public function up()

    Schema::table('follow_up_task', function (Blueprint $table) 
        $table->date('next_follow_date')->change();
        $table->integer('follow_stop_after')->change();
    );


public function down()

    Schema::table('follow_up_task', function (Blueprint $table) 
        $table->string('next_follow_date')->change();
        $table->string('follow_stop_after')->change();
    );

但我遇到了一个错误。

Illuminate\Database\QueryException : SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在第 1 行的“CHARACTER SET utf8mb4 DEFAULT NULL COLLATE utf8mb4_unicode_ci, CHANGE recurrin”附近使用正确的语法(SQL:ALTER TABLE recurring_tasks CHANGE next_recurring_date next_recurring_date DATE CHARACTER SET utf8mb4 DEFAULT NULL COLLATE utf8mb4_unicode_ci, CHANGE recurring_stop_after recurring_stop_after INT CHARACTER SET utf8mb4 DEFAULT NULL COLLATE utf8mb4_unicode_ci)

at /home/vagrant/laravel-api/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
665|         // If an exception occurs when attempting to run a query, we'll format the error
666|         // message to include the bindings with SQL, which will make this exception a
667|         // lot more helpful to the developer instead of just the database's errors.
668|         catch (Exception $e) 
669|             throw new QueryException(
670|                 $query, $this->prepareBindings($bindings), $e
671|             );
672|         
673| 

Exception trace:

1 Doctrine\DBAL\Driver\PDOException::("SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本对应的手册以获取正确的语法在第 1 行的“CHARACTER SET utf8mb4 DEFAULT NULL COLLATE utf8mb4_unicode_ci, CHANGE recurrin”附近使用) /home/vagrant/laravel-api/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:63

2 PDOException::("SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在 'CHARACTER SET 附近使用的正确语法utf8mb4 DEFAULT NULL COLLATE utf8mb4_unicode_ci, CHANGE recurrin' at line 1") /home/vagrant/laravel-api/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:61

请使用参数 -v 查看更多详细信息。

【问题讨论】:

在 composer.json 中添加学说/dbal 依赖以获取更多信息,您可以在这里找到它laravel.com/docs/5.1/migrations#modifying-columns 我已经添加了学说/dbal 依赖 【参考方案1】:

那么这可能是因为最新版本的 doctrine/dbal v2.10.0 包中的错误。

您可以将composer.json 中的doctrine/dbal 包降级为v2.9.3

https://github.com/laravel/framework/issues/30539#issuecomment-559605145

您可以像这样尝试在迁移up() 中使用原始sql 查询。

DB::statement("ALTER TABLE .....");

【讨论】:

【参考方案2】:

我们也可以使用

$table->date('next_follow_date')->charset('')->collation('')->change();

为了避免这个问题

【讨论】:

以上是关于Doctrine/dbal - 尝试将字符串字段更改为日期时出错的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine DBAL 可以与 ORM Query Builder 混合使用吗?

Doctrine DBAL ->execute() 和 Hydration,DB2 字段名称包括“#”

使用 insert() 方法通过 PHP Doctrine\DBAL 2 插入 DateTime 值

在作曲家 laravel 上安装依赖项(doctrine/dbal)

将 Doctrine DBAL 添加到自己的 php 项目中

如何使用 Doctrine DBAL?