3

几乎就像标题所说的那样;作为迁移的一部分,我需要更改列名,可以这样做吗?如果可以,怎么做?

4

6 回答 6

9

拉拉维尔 3

是的,它可以完成,但只能使用原始查询。某些 DBMS 不支持更改列名,因此决定不实现此类功能,因为对于某些 DBMS,它会失败。

DB::raw()所以不要忘记你可以在迁移中利用原始查询。您可以通过这种方式更改列名。

拉拉维尔 4

在 Laravel 4.1 中,您必须doctrine/dbalcomposer.json.

"doctrine/dbal": "2.4.*"

运行后composer update,您现在可以使用该renameColumn方法。

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

这会将location列重命名为address.

于 2012-11-15T07:38:03.183 回答
3

renameColumn() 方法在 Laravel 4.1 中默认不可用,请参阅发行说明:

如果您在迁移中使用 renameColumn 函数,则需要将教义/dbal 依赖项添加到您的 composer.json 文件中。默认情况下,这个包不再包含在 Laravel 中。

http://laravel.com/docs/releases

于 2013-12-16T20:43:23.650 回答
2

请注意,从 Laravel 4 开始,DB Schema确实允许通过$table->renameColumn('from', 'to').

于 2013-07-26T20:59:06.177 回答
1

在 Laravel 4的renameColumn()功能被修复之前(现在它失败并There is no column with name出现错误),你可以使用这样的东西:

Schema::table('table_name', function(Blueprint $table) {
    $table->string('new_name')->after('some_other_column_name');
});
DB::table('table_name')->update(array('new_name' => DB::raw('old_name')));
Schema::table('table_name', function(Blueprint $table) {
    $table->dropColumn('old_name');
});
于 2013-11-04T23:48:47.860 回答
1

我尝试使用laravel 的模式构建器中提到的语法,如下所示:

public function up()
{
    if (Schema::hasColumn('lesson_plans', '`desc`'))
    {
        Schema::table('lesson_plans', function(Blueprint $table)
        {
                $table->renameColumn('`desc`', 'comment');
        });
    }
}
    ..

虽然这在我的 localhost 机器上工作得很好。但是,它在 prod 上出现以下错误:

[PDO Exception]
SQLSTATE [HY000]: General error: 1366 incorrect string value: '\xD9\x8A\xD8\xB1\xD8\xAC\...' for column 'comment' at row 115

做一些研究..事实证明这个错误与字符集和排序规则有关..我在网上找不到任何东西告诉我如何使用 laravel 的模式构建器指定这些人(坦率地说,这些例子非常稀缺).. 我只是像这样使用 DB::RAW:

public function up()
{
    if (Schema::hasColumn('lesson_plans', '`desc`'))
    {
        DB::select(DB::raw('alter table lesson_plans change `desc` `comment` longtext character set utf8 collate utf8_general_ci default null'));
    }
}

在当地和产品上像魅力一样工作!

关键是DB::Raw可以做任何你想做的迁移,而不会遇到 Laravel 的限制。

于 2014-04-19T06:44:39.210 回答
1

根据https://github.com/laravel/laravel/issues/2146, renameColumn 已被删除并且没有可用的修复:

public function renameColumn($oldColumnName, $newColumnName) {
    throw new DBALException("Table#**renameColumn() was removed**, because it drops and recreates the column instead. **There is no fix available**, because a schema diff cannot reliably detect if a column was renamed or one column was created and another one dropped.");
}

对于 Laravel 4.1 和学说/dbal 2.2,这可以在 vendor/doctrine/dbal/UPGRADE 中找到

于 2014-04-29T21:57:13.377 回答