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