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

hec6srdp  于 2023-11-20  发布在  其他
关注(0)|答案(7)|浏览(216)

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

xdnvmnnf

xdnvmnnf1#

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

  1. public function up()
  2. {
  3. Schema::table('sometable', function (Blueprint $table) {
  4. $table->text('text')->change();
  5. });
  6. }

字符串
您需要安装doctrine/dbal才能使其工作

  1. composer require doctrine/dbal


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

lf5gs5x2

lf5gs5x22#

这可以通过一个TABLE迁移来实现。
正如在其他文章中提到的,确保从项目根运行composer require doctrine/dbal
这些机构的设置包括:

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

字符串
从你的项目根。
来自文档:
https://laravel.com/docs/master/migrations#modifying-columns

  1. class AlterTableSomething extends Migration
  2. {
  3. /**
  4. * Run the migrations.
  5. *
  6. * @return void
  7. */
  8. public function up()
  9. {
  10. Schema::table('table', function (Blueprint $table) {
  11. $table->text('column_name')->change();
  12. });
  13. }
  14. }

展开查看全部
pnwntuvh

pnwntuvh3#

根据Laravel Doc
你可以这样做

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

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

9vw9lbht

9vw9lbht4#

如果您在使用change()时出现以下错误
请求未知的数据库类型枚举,Doctrine\DBAL\Platforms\MySQL80Platform可能不支持它。
这意味着在你的表中存在一些列(不一定是被改变的),它具有枚举类型。所以你可以使用下面的函数来代替change()

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

字符串
像这样使用:$this->changeColumnType('sometable','text','TEXT');

hc8w905p

hc8w905p5#

跟踪为我工作。
当然,你需要安装doctrine/dbal才能使其工作,在终端中使用以下命令。

  1. composer require doctrine/dbal

字符串
然后按照此处所述创建迁移-https://laravel.com/docs/master/migrations#generating-migrations
打开您的迁移文件并在下面写下。

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


由于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.如果您不想弄乱其他依赖项,请确保使用以下命令安装此软件包

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

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

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

  • 根据您的需要更改其内容
  1. // Let's assume we change an integer column's type to string
  2. /**
  3. * Run the migrations.
  4. *
  5. * @return void
  6. */
  7. public function up()
  8. {
  9. Schema::table('yyy', function (Blueprint $table) {
  10. $table->string('xxx')->change();
  11. });
  12. }
  13. /**
  14. * Reverse the migrations.
  15. *
  16. * @return void
  17. */
  18. public function down()
  19. {
  20. Schema::table('yyy', function (Blueprint $table) {
  21. $table->integer('xxx')->change();
  22. });
  23. }

  • 运行迁移
  1. php artisan migrate

展开查看全部
b4wnujal

b4wnujal7#

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

  1. return new class extends Migration
  2. {
  3. public function up()
  4. {
  5. Schema::table('sandbox', function (Blueprint $table) {
  6. $table->text('column_name')->change();
  7. });
  8. }
  9. public function down()
  10. {
  11. Schema::table('sandbox', function (Blueprint $table) {
  12. $table->string('column_name')->change();
  13. });
  14. }
  15. };

字符串

展开查看全部

相关问题