将字符串转换为十进制数的 Laravel 迁移。

3

我正在尝试修改当前的表格,可以在我的迁移文件中使用SQL查询来完成这个过程,如下:

<?php
    public function up()
    {
        Schema::table('xyz', function (Blueprint $table) {
        DB::statement('ALTER TABLE mydatabase.xyz CHANGE funding_needed funding_needed decimal(10, 2) NOT NULL DEFAULT 0.00 ');
        DB::statement('ALTER TABLE mydatabase.xyz CHANGE funding_received funding_received decimal(10, 2) NOT NULL DEFAULT 0.00 ');
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('xyz', function (Blueprint $table) {
        DB::statement('ALTER TABLE mydatabase.xyz CHANGE funding_needed funding_needed varchar(191) NOT NULL ');
        DB::statement('ALTER TABLE mydatabase.xyz CHANGE funding_received funding_received varchar(191) NOT NULL DEFAULT 0');
        });
    }


但如果我按这种方式做,就会出现错误:
<?php
    public function up()
    {
        Schema::table('xyz', function (Blueprint $table) {
             $table->decimal('funding_needed', 10, 2)->nullable(false)->default(0.00)->change();
             $table->decimal('funding_received', 10, 2)->nullable(false)->default(0.00)->change();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('xyz', function (Blueprint $table) {          
         $table->string('funding_needed', 191)->nullable(false)->default(false)->change();
         $table->string('funding_received', 191)->nullable(false)->default(0)->change();
        });
    }

错误:

语法错误或访问违规: 1064 您的SQL语法中有一个错误; 请查看对应于您的MySQL服务器版本的手册,以了解正确使用的语法near 'CHARACTER SET utf8mb4 DEFAULT'0' NOT NULL COLLATE utf8mb4_unicode_ci, CHANGE'第1行(SQL: ALTER TABLE xyz CHANGE funding_needed funding_needed NUMERIC(10, 2) CHARACTER SET utf8mb4 DEFAULT'0' NOT NULL COLLATEutf8mb4_unicode_ci, CHANGE funding_received funding_received NUMERIC(10, 2) CHARACTER SET utf8mb4 DEFAULT'0' NOT NULL COLLATEutf8mb4_unicode_ci)

我想采用第二种方法,因为我正在生产环境中运行此操作。 我不想修改生产迁移以匹配我的生产数据库。


不知道你遇到的具体错误是什么,但我认为同时使用NOT NULL和DEFAULT是多余的。如果它有一个默认值,那么显然不会为空,对吧? - Erubiel
你说得对。我只是试图匹配SQL查询。如果我删除 nullable(false) 并仅保留默认值,它仍然无法正确运行。 - daugaard47
你尝试将参数作为字符串传递了吗?在 PHP 中,0.00 可能不是一个有效的数字,但 "0.00" 是。 - Erubiel
作为字符串可以正常工作,但作为十进制数无法正常工作。我正在尝试将它从一个字符串转换成一个十进制数。 - daugaard47
我的意思是$table->decimal('funding_needed', 10, 2)->nullable(false)->default("0.00")->change(); - Erubiel
显示剩余2条评论
2个回答

3
作为doctrine/dbal包的 Github讨论串中指出,在运行此更新迁移之前安装的包中,存在更改列类型的错误。
如链接中所示,同时使用->charset(null)->change()应该作为临时解决方法。

我已经尝试了几种方法,甚至尝试将$table->string更改为$table->decimal,但仍然出现错误。完整的错误已经更新在我的原始问题中。 - daugaard47
那么,即使你单独运行change方法,你还是会得到一个错误吗?如果你只运行那部分代码,你会得到什么错误? - Erubiel
如果我运行 $table->decimal('funding_needed', 10, 2)->change();,我会得到上述问题中的错误。 - daugaard47
1
请看这里:https://github.com/doctrine/dbal/issues/3714#issuecomment-571998622 - Erubiel
2
请在更改之前使用 ->charset(null),这样就可以解决问题了!感谢您的帮助。请更新您的答案,以便我可以将其标记为正确的。 - daugaard47

0

大家好,我在将 string 转换为 decimal 时遇到了麻烦,正如 @echo 在评论中所说:

->charset(null)->change(); 解决了问题!

感谢大家节省了我的时间!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接