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

mik*_*ike 14 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');
});
Run Code Online (Sandbox Code Playgroud)

我会改sendersender_id,recipientrecipient_idregardingregarding_id.

Kaj*_*thy 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)');
} 
Run Code Online (Sandbox Code Playgroud)


Ben*_*Ben 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 Code Online (Sandbox Code Playgroud)

第二次迁移:

/**
 * 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');
    }
}
Run Code Online (Sandbox Code Playgroud)

现在考虑这个问题可以简化为单一迁移.


Cha*_*qas 5

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

Schema::table('users', function ($table) {
    $table->string('id')->change();
});
Run Code Online (Sandbox Code Playgroud)

并重命名列

Schema::table('users', function ($table) {
    $table->renameColumn('from', 'to');
});
Run Code Online (Sandbox Code Playgroud)


bra*_*k11 0

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