Schema::table('users', function (Blueprint $table) {
$table->dropTimestamps();
$table->dropColumn(['email', 'bio']);
$table->string('email', 20)->unique()->after('id');
$table->string('bio', 150)->after('surname');
$table->timestamps();
});
这就是我现在所拥有的。所以,我的表中存在atm列,但我想修改并重新排列它们。但是当我运行迁移时,我收到email
列存在的SQL错误。我也可能会为bio
和timestamps
收到相同的错误。我有点理解为什么会这样,所以我要问的只是解决方法。
是否可以在一次迁移中制作我想要的内容,或者我必须创建一个用于删除列的迁移,然后单独迁移以便按照我想要的方式创建它们?
答案 0 :(得分:7)
将模式分解为两个调用
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->dropTimestamps();
$table->dropColumn(['email', 'bio']);
});
Schema::table('users', function (Blueprint $table) {
$table->string('email', 20)->unique()->after('id');
$table->string('bio', 150)->after('surname');
$table->timestamps();
});
}
这种方式是在一次迁移中进行了两次数据库调用。
答案 1 :(得分:1)
请考虑,如果删除这些列,则将丢失其中包含的所有数据。通常,这是一个非常糟糕和危险的想法。如果您只需要简单地更改参数,则应使用change()
函数对架构进行必要的修改。这样会将现有数据转换为数据库的最佳功能。
除非您完全知道自己在做什么,否则请不要在正在使用的数据库上删除列。
public function up()
{
Schema::table('users', function (Blueprint $table) {
// Add the unique constraint, for example
$table->string('email', 20)->unique()->after('id')->change();
// Add the length to the bio, for example
$table->string('bio', 150)->after('surname')->change();
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
// Remove length and constraints
$table->string('email')->unique(false)->change();
$table->string('bio')->change();
});
}