Laravel 4.2 迁移 - 更改小数精度和小数位数而不删除列

Gra*_*avy 3 database-migration laravel

我希望增加小数列的小数精度和小数位数。

我知道我可以删除该列并重新创建它,但这样做将意味着丢失该列中的数据。

有没有一种方法可以使用 Laravel Schema::table 来改变列的精度和比例而不删除它?

例如:

Schema::table('prices', function(Blueprint $t) {
    $t->buy_price->decimal(5,2);
});
Run Code Online (Sandbox Code Playgroud)

Max*_*ine 8

这对我有用:

public function up()
{
    Schema::table('prices', function(Blueprint $t) {
        $t->decimal('buy_price', 5, 2)->change();
    });
}
Run Code Online (Sandbox Code Playgroud)

回滚时使用原始精度值3、1代替

public function down()
{
    Schema::table('prices', function(Blueprint $t) {
        $t->decimal('buy_price', 3, 1)->change();
    });
}
Run Code Online (Sandbox Code Playgroud)

我避免使用数据库特定的“原始”语句,因为当我更改为另一个 DBMS 引擎时它们可能会失败。所以我让 Laravel 在使用 DB 时处理必要的语法


The*_*pha 5

只需创建另一个migration并在up方法中添加以下代码:

public function up()
{
    // Change db_name and table_name
    DB::select(DB::raw('ALTER TABLE `db_name`.`table_name` CHANGE COLUMN `buy_price` `buy_price` decimal(10,2) NOT NULL;'));

}
Run Code Online (Sandbox Code Playgroud)

另外,在down方法中只需设置旧值,这样您就可以roll-back

public function down()
{
    // Change db_name and table_name
    DB::select(DB::raw('ALTER TABLE `db_name`.`table_name` CHANGE COLUMN `buy_price` `buy_price` decimal(5,2) NOT NULL;'));

}
Run Code Online (Sandbox Code Playgroud)

然后照常从terminal/command promptusing迁移php artisan migrate