在 Laravel 迁移中更改列类型的最佳方法是啥?

Posted

技术标签:

【中文标题】在 Laravel 迁移中更改列类型的最佳方法是啥?【英文标题】:What is the best way to change a column type in Laravel migration?在 Laravel 迁移中更改列类型的最佳方法是什么? 【发布时间】:2016-11-12 10:46:04 【问题描述】:

我的数据库中有一个用户表:

        $table->increments('id');
        $table->string('fullName');
        $table->string('email')->unique();
        $table->string('password', 50);
        $table->enum('role',['boss','employee','customer'])->default('customer');
        $table->rememberToken();
        $table->timestamps();

我需要将“角色”列类型更改为“文本”,然后在 Laravel 中运行新的迁移。如果我不想对以前的数据产生影响,那么最好的方法是什么。

【问题讨论】:

【参考方案1】:

你可以尝试:

    创建一个名为“roleTemp”的新文本列 运行查询为每条记录设置此列 - 基于“角色”列 删除“角色”列 将“roleTemp”重命名为“role”

现在只需按原样更改您的数据库架构:

$table->increments('id');
$table->string('fullName');
$table->string('email')->unique();
$table->string('password', 50);
$table->string('role');
$table->rememberToken();
$table->timestamps();

基本上,您将角色值复制到(临时)列并重命名。至少它是安全的,不会花费很多时间。

【讨论】:

【参考方案2】:

就像下面这样简单,用这一行创建一个新的迁移。请注意 ->change() 函数,它使其成为 ALTER 查询。

Schema::table('usertable', function (Blueprint $table) 
    $table->string('role')->default('author')->change();
);
    

记住 string() 默认的大小是 255,如果你的枚举值大于这个值,它会将枚举值截断为 255 个字符。

更新: 您需要安装 doctrine/dbal 才能使其正常工作,请参阅 Laravel Migration - Modify Columns

要安装教义/dbal,只需执行composer require doctrine/dbal

注意:目前不支持修改表中也具有枚举类型列的任何列。

【讨论】:

我采纳了你的建议,但遇到了这个错误:[Doctrine\DBAL\DBALException] Unknown database type enum requested, Doctrine\DBAL\Platforms\mysqlPlatform may not support it. 查看我的更新,这是正确的 laravally 方式。 我进行了安装,但没有成功!在您的链接([laravel.com/docs/master/migrations#modifying-columns])中,您可以阅读:Modifying any column in a table that also has a column of type enum is not currently supported.

以上是关于在 Laravel 迁移中更改列类型的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel Migrations 中存储时区的最佳方法是啥

生成 Android 房间迁移的最佳方法是啥?

在 Laravel 迁移中更改列会导致异常:更改表的列需要 Doctrine DBAL

如何使用 Laravel 模式构建器更改列类型?

Laravel migrate - 列类型字符串不更新大小

在 Laravel 中存储网站设置的最佳方式是啥? [关闭]