【问题标题】:Laravel 5 Migration change length of existed columnLaravel 5 迁移更改现有列的长度
【发布时间】:2016-07-27 22:33:57
【问题描述】:

它不起作用,我搜索了很多方法,如何在 laravel 5 中更改值的长度

public function up()
{
    Schema::table('articles', function (Blueprint $table) {
        $table->string('name',50)->change();
    });
}

感谢大家的阅读!

【问题讨论】:

标签: laravel


【解决方案1】:

有一个与 Doctrine DBAL 相关的未决问题(开放多年,仍在讨论中)(在此讨论:https://github.com/laravel/framework/issues/1186)。

这个问题的欺骗性部分是,如果任何列的类型为枚举,->change() 将失败(不仅仅是您要更改的列!)

如果您的表有一个 enum 列,您需要恢复为使用 alter 语句(注意您不需要将其包装在 Table::schema 中:

DB::statement('ALTER TABLE users MODIFY COLUMN name VARCHAR(50)')

【讨论】:

    【解决方案2】:

    至少在 Laravel 5.6 中,如果它需要 Doctrine DBAL 并且你现在出于任何原因不想安装它,你可以试试这个:

    <?php
    
    // ...
    
    Schema::table('users', function ($table) {
        DB::statement('ALTER TABLE users MODIFY COLUMN name VARCHAR(50)');
    });
    

    【讨论】:

    • 这是唯一对我有用的东西。我尝试使用教义/dbal,但它不会改变我的列。但这做到了!因此,虽然不完全是我想要的答案,但它确实有效,而且我在这方面花费的时间太长了。
    • 经过进一步检查,发生在我身上的是教义/dbal 正在更改多个表中的某些列,但不是全部。这将 100% 确定地改变每一列!
    • DB::statement('ALTER TABLE users MODIFY COLUMN name VARCHAR(50)');就够了,不需要把它包装在 Schema::table 调用中
    【解决方案3】:

    关于documentation,你的例子应该可以工作:

    Schema::table('users', function ($table) {
        $table->string('name', 50)->change();
    });
    

    只需运行php artisan migrate 命令即可执行。

    【讨论】:

    • 对不起!你能教我如何将列更改为外键。感谢您对我的支持!
    • SQLSTATE[42000]:语法错误或访问冲突:1075 表定义不正确;只能有一个自动列,并且必须将其定义为键(SQL:ALTER TABLE 文章 CHANGE 代码代码 VARCHAR(50) NOT NULL,CHANGE 名称名称 VARCHAR(50) NOT NULL,CHANGE 排序排序 INT AUTO_INCREMENT NOT NULL )
    • @SangTrần,你应该开始新的问题。描述您的问题以及您在那里尝试了什么,发布您的原始迁移和错误文本。我或其他 SO 人会帮助你。 ;)
    • 这不起作用可能是因为名称是 MySQL 中的特殊单词。我对带有名称键的列有同样的问题。
    • @SangTrần 这不起作用,因为 laravel 会更改表 [table]。要修改具有外键约束的列,您必须使用 alter table [table] modify(即 DB::statement('alter table [table] modify [column] [changes]');)。
    猜你喜欢
    • 2023-04-05
    • 2021-07-01
    • 2017-10-03
    • 2017-03-25
    • 2016-08-28
    • 2019-05-03
    • 2015-07-22
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多