69

我需要将迁移列类型更改$table->string('text');为文本类型,我尝试以几种方式做到这一点,但都没有奏效。是否可以在一次迁移中完成?我可以猜测删除该列,然后使用新类型再次创建它,但我想知道是否可以在一次迁移中做到这一点?

4

5 回答 5

112

您可以创建一个新的迁移并仅更改一种列类型

public function up()
{
    Schema::table('sometable', function (Blueprint $table) {
        $table->text('text')->change();
    });
}

您需要安装doctrine/dbal才能使这项工作

composer require doctrine/dbal

适用于 Laravel 5.0+。它不适用于 Laravel 4.2。

于 2016-06-09T11:17:16.400 回答
27

可以使用 TABLE 迁移。

如其他帖子中所述,请务必composer require doctrine/dbal从您的项目根目录运行。

这些设置如下:

php artisan make:migration alter_table_[yourtablenamehere]_change_[somecolumnname] --table=[yourtablenamehere]

从您的项目根目录。

从文档:

https://laravel.com/docs/master/migrations#modifying-columns

class AlterTableSomething extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('table', function (Blueprint $table) {
            $table->text('column_name')->change();
        });
    }
}
于 2016-06-09T11:27:17.077 回答
19

根据Laravel 文档

你可以这样做

Schema::table('yourTable', function (Blueprint $table) {
    $table->text('text')->change();
});

确保将教义/dbal 依赖项添加到您的 composer.json 文件中

于 2016-06-09T11:17:36.353 回答
12

如果您使用以下错误change()

请求的未知数据库类型枚举,Doctrine\DBAL\Platforms\MySQL80Platform 可能不支持它。

这意味着在您的表中存在一些具有枚举类型的列(不一定要更改一个)。change()因此,您可以使用以下功能代替使用:

public function changeColumnType($table, $column, $newColumnType) {                
    DB::statement("ALTER TABLE $table CHANGE $column $column $newColumnType");
} 

并像这样使用它:$this->changeColumnType('sometable','text','TEXT');

于 2018-12-05T09:02:49.907 回答
4

以下为我工作。

当然,您需要在终端中使用以下命令安装教义/dbal才能完成这项工作。

composer require doctrine/dbal

然后按照此处所述创建迁移 - https://laravel.com/docs/master/migrations#generating-migrations

打开您的迁移文件并在下面写下。

Schema::table('yourTable', function (Blueprint $table) {
    $table->string('column_name','4294967295')->change();
});

由于 longText 最多有 4,294,967,295 个字符的限制,Laravel 会自动将 column_name 更改为 longText 数据类型。

于 2020-09-16T06:53:24.047 回答