Php 使用Laravel,可以在迁移过程中更改列名吗?

Php 使用Laravel,可以在迁移过程中更改列名吗?,php,laravel,Php,Laravel,几乎就是标题所说的;作为迁移的一部分,我需要更改列名,可以吗?如果可以,如何更改?Laravel 3 是的,可以这样做,但只能使用原始查询。有些DBMS不支持更改列名,因此决定不实现这种功能,因为有些DBMS可能会失败 所以不要忘记,您可以在迁移中使用DB::raw()利用原始查询。您可以通过这种方式更改列名 拉维尔4号 在Laravel4.1中,必须在composer.json中添加doctrine/dbal作为依赖项 "doctrine/dbal": "2.4.*" 运行composer

几乎就是标题所说的;作为迁移的一部分,我需要更改列名,可以吗?如果可以,如何更改?

Laravel 3 是的,可以这样做,但只能使用原始查询。有些DBMS不支持更改列名,因此决定不实现这种功能,因为有些DBMS可能会失败

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

拉维尔4号 在Laravel4.1中,必须在
composer.json
中添加
doctrine/dbal
作为依赖项

"doctrine/dbal": "2.4.*"
运行
composer update
后,现在可以使用
renamecocolumn
方法

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

这将把
位置
列重命名为
地址。

请注意,从Laravel 4开始,DB模式允许通过进行列重命名。

直到Laravel 4的
重命名列()
功能得到修复(现在它因
没有名为
错误的列而失败),您可以使用以下内容:

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');
});
默认情况下,renameColumn()方法在Laravel 4.1中不可用,请参阅发行说明:

如果在迁移中使用renameColumn函数,则 将需要向composer.json添加条令/dbal依赖项 文件默认情况下,此软件包不再包含在Laravel中

我尝试使用laravel的schema builder中提到的:

public function up()
{
    if (Schema::hasColumn('lesson_plans', '`desc`'))
    {
        Schema::table('lesson_plans', function(Blueprint $table)
        {
                $table->renameColumn('`desc`', 'comment');
        });
    }
}
    ..
虽然这在我的本地主机上运行得很好。。但是,它在prod上阻塞,出现以下错误:

[PDO Exception]
SQLSTATE [HY000]: General error: 1366 incorrect string value: '\xD9\x8A\xD8\xB1\xD8\xAC\...' for column 'comment' at row 115
做一些研究。。此错误可能与字符集和排序规则有关。。我在网上找不到任何东西可以告诉我如何使用laravel的schema builder指定这些人(坦率地说,示例非常稀少)。。我刚刚使用了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'));
    }
}
在本地和prod上都表现得很有魅力

关键是DB::Raw可以执行任何您想要的迁移,而不会遇到Laravel的限制

根据,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.");
}

对于带有条令/dbal 2.2的Laravel 4.1,可以在供应商/doctrine/dbal/UPGRADE中找到这一点

中没有关于重命名列的说明,并且语法文件中没有包含“更改”的代码。我认为这是不可能与拉威尔3。感谢您的期待。我觉得很奇怪,作为迁移的一部分,这似乎是一件很明显的事情……请解释一下Laravel 5的情况,我很确定它在Laravel 5中仍然是一样的。