错误迁移:无法声明类 X,因为该名称已在使用中

2022-08-30 09:18:43

我不知道为什么在执行迁移时会发生此错误,因为我没有重复的类。

迁移:

2014_10_12_100000_create_password_resets_table.php
2019_01_18_020910_create_roles_table.php
2019_01_18_025535_create_members_table.php
2019_01_18_025536_create_users_table.php
2019_01_18_183649_create_projects_table.php
2019_01_18_184249_create_member_project_table.php
2019_01_18_184719_create_sprints_table.php
2019_01_18_185218_create_tasks_table.php
2019_01_21_033045_add_shortname_to_project.php

错误:

PHP Fatal error:  Cannot declare class CreateRolesTable, because the name is already in use in
oyectos\database\migrations\2019_01_18_020910_create_roles_table.php on line 33

In 2019_01_18_020910_create_roles_table.php line 33:

  Cannot declare class CreateRolesTable, because the name is already in use

类:

class CreateRolesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('roles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name',128)->unique();
            $table->string('description');
            $table->boolean('system');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('roles');
    }
}

答案 1

除了给出的其他答案外,如果迁移文件名不是类名的 snake-case 版本,也会发生此错误。

因此,迁移文件必须包含类 。如果它包含缺少的类,则抛出“无法声明 X...”错误。我在Laravel 8上发现了这一点,可能适用于早期版本。2019_01_18_020910_create_roles_table.phpCreateRolesTableCreateRoleTables

发生这种情况的原因是,当文件名拼写错误时,Laravel 会多次加载迁移文件,而第二次加载是在引发异常时。


答案 2

第一个解决方案:

看起来您在不同的时间完成了2次迁移,名称基本相同。

例如:2019_01_18_020910_create_roles_table.php

2019_01_16_020910_create_roles_table.php

Laravel将转换此文件名,删除日期签名和驼峰大小写剩余文本。

因此,即使时间签名不同,这两种迁移也将具有类。检查您的迁移目录是否有这样的2个文件。CreateRolesTable

要检查这一点,请在项目根目录中从终端运行此命令:grep -ri 'createrolestable' database/migrations

第二种解决方案:

有时,作曲家的内部类自动加载会导致此问题。执行以下操作以检查它是否解决:

composer install

第三种解决方案

这可能无效,但同一文件不应错误地具有相同的类声明 2 文件。

第四种解决方案

您可能已安装了一个包,该包具有具有相同类名的迁移。查找运行grep -ril 'createrolestable' vendor

如果它显示任何文件,那么这就是导致2个类具有相同的名称的原因。

您可以创建一个新的。然后将当前迁移中的内容复制到新迁移中,并删除现有迁移(不是从包中删除,而是从已创建的包中删除)。php artisan make:migration create_roles_table_custom

这将创建一个与包已有的类不同的类。CreateRolesTableCustom


推荐