如何使用Laravel架构生成器更改列类型?

时间:2014-02-27 06:08:08

标签: database laravel-4

我需要将两个字段从整数更改为外键。如何建立我的迁移?

Schema::create('messages', function($table)
{
    $table->increments('id');
    $table->integer('sender');
    $table->integer('recipient');
    $table->string('title');
    $table->longtext('body');
    $table->timestamps();
    $table->softDeletes();
    $table->integer('regarding');
});

我会将sender更改为sender_id,将recipient更改为recipient_id,将regarding更改为regarding_id

9 个答案:

答案 0 :(得分:8)

不要过多考虑它,我正在使用以下代码。在这里,我将数据类型从varchar更改为text。

public function up(){
    DB::statement('ALTER TABLE items MODIFY COLUMN item_description TEXT');
    DB::statement('ALTER TABLE items MODIFY COLUMN delivery_description TEXT');
}

public function down(){
    DB::statement('ALTER TABLE items MODIFY COLUMN item_description VARCHAR(255)');
    DB::statement('ALTER TABLE items MODIFY COLUMN delivery_description VARCHAR(255)');
} 

答案 1 :(得分:7)

我遇到了一个类似的问题,需要将列类型从字符串更改为整数。我使用两个单独的迁移(每个迁移中都有一个RAW sql语句)来管理它,以获得解决方案。

此外,这适用于Postgres和MySQL,因为我们正处于转移过程中。

第一次迁移:

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('plans', function(Blueprint $table)
    {
        //
        $table->mediumInteger('duration_change_type')->default(0)->after('duration');
    });

    if (Config::get('database')['default'] === 'mysql'){
        // Mysql 
        DB::statement('update plans set duration_change_type=duration');

    } else if (Config::get('database')['default'] === 'pgsql'){
        // PostgreSQL
        DB::statement('update plans set duration_change_type=duration::integer');
    }
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('plans', function(Blueprint $table)
    {
        //
        $table->dropColumn('duration_change_type');
    });
}

第二次迁移:

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('plans', function(Blueprint $table)
    {
        //
        $table->dropColumn('duration');
        $table->renameColumn('duration_change_type', 'duration');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('plans', function(Blueprint $table)
    {
        // Rollback to string
        $table->string('duration_change_type')->default(0)->after('duration');
    });
    if (Config::get('database')['default'] === 'mysql'){
        // Mysql 
        DB::statement('update plans set duration_change_type=duration');

    } else if (Config::get('database')['default'] === 'pgsql'){
        // PostgreSQL
        DB::statement('update plans set duration_change_type=duration::text');
    }
}

现在考虑一下,它可以简化为单一迁移。

答案 2 :(得分:5)

如果要更改列类型或修改长度等,只需调用change()方法

即可
Schema::table('users', function ($table) {
    $table->string('id')->change();
});

并重命名列

Schema::table('users', function ($table) {
    $table->renameColumn('from', 'to');
});

答案 3 :(得分:2)

我遇到了同样的问题,而最快的解决方案是简单地更改数据库上的列结构,然后更改原始迁移以反映对数据库所做的更改。

这样,如果迁移被回滚然后再次向上,则将创建正确的字段。只要你确保准确地改变迁移,我就无法看到任何不利因素。

答案 4 :(得分:1)

我有一个类似的问题,试图将列类型从文本更改为二进制。我在尝试运行migrate命令时遇到错误。 我最终以这种方式解决了问题:

public function up()
{
    Schema::table('user', function (Blueprint $table) {
        $table->dropColumn('address');
    });
    Schema::table('user', function (Blueprint $table) {
        $table->binary('address')->nullable();
    });
}

答案 5 :(得分:0)

您可以尝试使用$table->renameColumn('from', 'to');将列重命名为临时列,然后使用外键的标准创建行创建新列,最后将数据从临时列复制到具有控制器功能的新列。 应该工作,但我没有尝试过,没有必要。

答案 6 :(得分:0)

我会删除它,然后将其重新添加为其他类型。

答案 7 :(得分:0)

在Laravel 5中,您可以使用如下所示的闭包。这应该以数据库无关的方式进行,因此不需要if-statements检查数据库类型。

(请注意,您可能需要作曲家需要doctrine / dbal 来执行此操作。)

public function up() {
    Schema::table('plans', function($t) {
        $t->renameColumn('duration_change_type', 'duration');
    });
}

public function down() {
    Schema::table('plans', function($t) {
        $t->renameColumn('duration', 'duration_change_type');
    });
}

答案 8 :(得分:0)

您可以使用change()函数更改列名。这里我以一个模式表为例

class="dropdown"