Laravel迁移将列类型从varchar更改为longText

hec6srdp  于 6个月前  发布在  其他
关注(0)|答案(7)|浏览(90)

我需要将$table->string('text');的迁移列类型更改为文本类型,我尝试了几种方法,但都不起作用。是否可以在一次迁移中完成?我可以我猜删除列,然后用新类型重新创建它,但我想知道是否可以在一次迁移中完成?

xdnvmnnf

xdnvmnnf1#

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

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。

lf5gs5x2

lf5gs5x22#

这可以通过一个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();
        });
    }
}

pnwntuvh

pnwntuvh3#

根据Laravel Doc
你可以这样做

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

字符串
确保将doctrine/dbal依赖项添加到composer.json文件中

9vw9lbht

9vw9lbht4#

如果您在使用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');

hc8w905p

hc8w905p5#

跟踪为我工作。
当然,你需要安装doctrine/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数据类型。

6qfn3psc

6qfn3psc6#

要做到这一点,你需要doctrine/dbal,这是真的。
“小心!”“小心!”“小心!”“小心!”“小心!”
有个更安全的办法
1.备份您的项目文件!
1.看看你的composer.json文件来记录你的PHP版本。假设你有7.2.5。现在,搜索一个兼容的版本,在这个例子中是2.13.9。
x1c 0d1x的数据
1.如果您不想弄乱其他依赖项,请确保使用以下命令安装此软件包

COMPOSER_MEMORY_LIMIT=-1 composer require doctrine/dbal "^2.13.9"

字符串
1.现在,我们准备做出改变!

  • 生成迁移文件
php artisan make:migration change_xxx_type_in_yyy_table --table=yyy

  • 根据您的需要更改其内容
// Let's assume we change an integer column's type to string
/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
  Schema::table('yyy', function (Blueprint $table) {
    $table->string('xxx')->change();
  });
}

/**
 * Reverse the migrations.
 *
 * @return void
*/
public function down()
{
  Schema::table('yyy', function (Blueprint $table) {
    $table->integer('xxx')->change();
  });
}

  • 运行迁移
php artisan migrate

b4wnujal

b4wnujal7#

之前建议的解决方案都很好,但令我惊讶的是,除了@Ahmet Firat Kele之外,没有人提到down()方法。当您运行php artisan migrate:rollback命令时,会执行此方法,并且在执行后,我们应该拥有在运行此迁移之前所做的更改。
这是关键!

return new class extends Migration
{
    public function up()
    {
        Schema::table('sandbox', function (Blueprint $table) {
            $table->text('column_name')->change();
        });
    }

    public function down()
    {
        Schema::table('sandbox', function (Blueprint $table) {
            $table->string('column_name')->change();
        });
    }
};

字符串

相关问题