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

Error migrations: Cannot declare class X, because the name is already in use

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

迁移:

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\migrations19_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:

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');
    }
}

第一个解决方案:

您似乎在不同时间以基本相同的名称完成了 2 次迁移。

例如:2019_01_18_020910_create_roles_table.php

2019_01_16_020910_create_roles_table.php

Laravel 将转换此文件名,消除日期签名和 Camel Casing 剩余文本。

因此即使拍号不同,这两个迁移都会有 class CreateRolesTable。检查你的migrations目录是否有这样的2个文件。

要从项目根目录中的终端检查此 运行:grep -ri 'createrolestable' database/migrations

第二种解法:

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

运行 composer install

第三个解决方案

这可能是无效的,但同一个文件不应该有相同的 class 错误声明 2 个文件。

第四个解决方案

您可能安装了一个具有相同 class 名称的迁移的软件包。求 运行 grep -ril 'createrolestable' vendor

如果它显示任何文件,那就是导致 2 class 同名的原因。

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

这将创建一个 class CreateRolesTableCustom,它与包中已有的不同。

我遇到了这个问题。我用 composer dump-autoload 解决了问题。

即使您没有任何具有相同 Class 名称的此类文件并且您仍然面临同样的问题,请尝试

composer dump-autoload

与给出的其他答案一样,如果迁移文件名不是 class 名称的蛇形版本,也会发生此错误。

因此迁移文件 2019_01_18_020910_create_roles_table.php 必须包含 class CreateRolesTable。如果它包含 class CreateRoleTable,但缺少 s,则会抛出“无法声明 X...”错误。我在 Laravel 8 上找到了这个,可能适用于早期版本。

好像是因为Laravel在文件名拼写错误的情况下多次加载迁移文件,第二次加载是抛出异常

就我而言,我有自己的包,它有迁移并且没有正确命名。我将它命名为没有日期:create_orders_table。 我将其更改为 2021_08_03_000000_create_orders_table 并且它有所帮助。

我 运行 进入了这个(误导性的)错误,结果我不小心从迁移 class 名称中省略了单词 Create

错误:Cannot declare class FooTable, because the name is already in use

不正确:class FooTable extends Migration

正确:class CreateFooTable extends Migration

注意迁移文件名。

对我来说,迁移文件名是:

2021-10-13_000000_create_examples_table

但正确的是:

2021_10_13_000000_create_examples_table

哈哈

对我来说,这是 Laravel Sanctum(现已内置于 Laravel 8)的问题。我通过一个包生成了迁移,结果不知何故在 vendor\laravel\sanctum\database\migrations.

中得到了一些东西

我 运行 php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" 将其持久化到标准迁移。

详情见here

这可能是由多种原因造成的。请按照以下步骤解决问题。 首先运行终端中的这个命令

php artisan optimize:clear

composer dump-autoload

如果这些不能解决问题,那么您重命名了从 Laravel Cashier 发布的迁移文件。要解决它,请执行以下操作:

Rename the migration file. Something like 2019_01_18_020910_create_roles_table can be renamed to 2019_01_18_020910_create_role_table

Rename the class. Something like CreateRolesTable can be renamed to CreateRoleTable

在我的例子中,它抛出错误是因为我更改了由 laravel 收银员添加的迁移文件的时间,我的时间顺序是正确的,但它仍然抛出名称问题。

然后我把时间调回原来的迁移时间,问题就解决了

如果您使用的是Laravel 8或以上版本,您可以使用匿名迁移来避免与Class名称冲突。

以下是您如何声明匿名迁移。不要忘记末尾的分号。

return new class extends Migration
{
    //
};

更多来自 Docs