我需要将两个字段从整数更改为外键。如何建立我的迁移?
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');
});
我会将sender
更改为sender_id
,将recipient
更改为recipient_id
,将regarding
更改为regarding_id
。
答案 0 :(得分: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)');
}
答案 1 :(得分: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 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');
}
}
现在考虑一下,它可以简化为单一迁移。
答案 2 :(得分:5)
如果要更改列类型或修改长度等,只需调用change()
方法
Schema::table('users', function ($table) {
$table->string('id')->change();
});
并重命名列
Schema::table('users', function ($table) {
$table->renameColumn('from', 'to');
});
答案 3 :(得分:2)
我遇到了同样的问题,而最快的解决方案是简单地更改数据库上的列结构,然后更改原始迁移以反映对数据库所做的更改。
这样,如果迁移被回滚然后再次向上,则将创建正确的字段。只要你确保准确地改变迁移,我就无法看到任何不利因素。
答案 4 :(得分:1)
我有一个类似的问题,试图将列类型从文本更改为二进制。我在尝试运行migrate命令时遇到错误。 我最终以这种方式解决了问题:
public function up()
{
Schema::table('user', function (Blueprint $table) {
$table->dropColumn('address');
});
Schema::table('user', function (Blueprint $table) {
$table->binary('address')->nullable();
});
}
答案 5 :(得分:0)
您可以尝试使用$table->renameColumn('from', 'to');
将列重命名为临时列,然后使用外键的标准创建行创建新列,最后将数据从临时列复制到具有控制器功能的新列。
应该工作,但我没有尝试过,没有必要。
答案 6 :(得分:0)
我会删除它,然后将其重新添加为其他类型。
答案 7 :(得分:0)
在Laravel 5中,您可以使用如下所示的闭包。这应该以数据库无关的方式进行,因此不需要if-statements检查数据库类型。
(请注意,您可能需要作曲家需要doctrine / dbal 来执行此操作。)
public function up() {
Schema::table('plans', function($t) {
$t->renameColumn('duration_change_type', 'duration');
});
}
public function down() {
Schema::table('plans', function($t) {
$t->renameColumn('duration', 'duration_change_type');
});
}
答案 8 :(得分:0)
您可以使用change()函数更改列名。这里我以一个模式表为例
class="dropdown"