Laravel 迁移 - 一次性运行多个迁移文件

14
假设我有多个迁移文件来更新单个表,例如:
2016_03_20_072730_create_tasks_table.php 2016_03_20_075467_create_tasks_table.php 这些文件来自不同团队成员的仓库。每个文件都在调整表中的某些内容,例如添加列。
当我尝试运行 "php artisan migrate" 命令时,会出现以下错误:
PHP Fatal error: Cannot declare class CreateTasksTable, because the name is already in use in U:\www\b10\database\migrations\2016_03_20_072737_create_tasks_table.php on line 30
[Symfony\Component\Debug\Exception\FatalErrorException] Cannot declare class CreateTasksTable, because the name is already in use 如何解决上述情况?
编辑:
以下是代码:
2016_03_20_072730_create_tasks_table.php:
class CreateTasksTable extends Migration { /** * 运行迁移。 * * @return void */ public function up() { Schema::table('tasks', function ($table) { $table->string('task1'); }); }
/** * 回滚迁移。 * * @return void */ public function down() { Schema::drop('tasks'); } }
2016_03_20_075467_create_tasks_table.php:
class CreateTasksTable extends Migration { /** * 运行迁移。 * * @return void */ public function up() { Schema::table('tasks', function ($table) { $table->string('task2'); }); }
/** * 回滚迁移。 * * @return void */ public function down() { Schema::drop('tasks'); } }
1个回答

14
每个迁移必须具有唯一的类名。将第二个迁移重命名为更合理的名称,例如 2016_03_20_075467_add_task2_to_tasks_tableAddTask2ToTasksTable,然后运行 composer dump-autoload 以使 Laravel 找到更改。现在你可以迁移了。
编辑:现在两个迁移的代码都已编辑到问题中,我可以看到第一个迁移也有同样的问题,应该以相同的方式进行重命名。可能还有一个更早的创建迁移。你应该停止将编辑迁移命名为任何带有 create 的内容,因为你实际上没有在创建表。

是的,我从错误中得出了同样的结论,但迁移应该比手动操作数据库好得多。据说你只需要获取最新的repo,运行迁移并喝一杯就可以了。但是现在看来,手动更新并没有落后于这个“自面包片以来最棒的东西”;)现在,你必须要么调整迁移文件,合并迁移文件,或将每个文件移动到临时文件夹并使用--path等选项。所以,我想这是一个失败的尝试。很多谈话,很少实际操作。除非有简单的方法-这就是我的问题所在。 - Jeffz
这很简单 - 你只需要合理地命名你的迁移。你不需要在数据库中做任何事情。我们可以这样说:与模型一起工作也非常容易。但是,如果你试图给两个模型取相同的名称,它就无法正常工作。你会认为这也使得模型难以处理吗? :) 只要教会你的团队成员给不同的迁移命名不同的名称,那就是你所需要的一切。 - Joel Hinz
2
迁移文件是由Laravel自动创建的。既然有一个快捷方式,Laravel是否很难在类名中添加一些随机字符串/哈希值呢?除非有什么东西反对这个过程。感谢Joel抽出时间来阅读。 - Jeffz
我通常是这样做的:对于表创建迁移,我使用 php artisan make:migration create_tablename --create=tablename;对于表编辑迁移,我使用 php artisan make:migration add_fieldname_to_tablename --table=tablename。根据我的需求,可能会使用 edit/delete/drop 等命令,而不是 add。这样,你就能确保不会出现重复项,除非你意外地尝试向数据库添加重复字段或表,但即使这样也不会起作用。希望能有所帮助。 :) - Joel Hinz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接