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

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

移民:

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');
}
}
58475 次浏览

第一个解决方案:

看起来你在不同的时间用基本相同的名字完成了2次迁移。

例如: 2019_01_18_020910_create_roles_table.php

2019_01_16_020910_create_roles_table.php

Laravel 将转换这个文件名,消除日期签名和骆驼大小写剩余的文本。

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

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

第二个解决方案:

有时候作曲家的内部类自动加载会导致这个问题。请执行以下操作来检查是否解决了这个问题:

运行 composer install

第三种解决方案 :

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

第四个解决方案 :

您可能已经安装了一个具有相同类名的迁移的包

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

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

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

我有这个问题。我使用 composer dump-autoload和它解决了这个问题。

即使您没有任何这样的文件具有相同的类名称,您仍然面临相同的问题,然后尝试

composer dump-autoload

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

因此迁移文件 2019_01_18_020910_create_roles_table.php必须包含类 CreateRolesTable。如果它包含类 CreateRoleTable(缺少 s) ,则“ Can not Declaration X。抛出错误。我在 Laravel 8上发现了这个,可能适用于早期版本。

之所以会出现这种情况,是因为当文件名拼写错误时,Laravel 会多次加载迁移文件,而第二次加载是在抛出异常时。

在我的例子中,我有自己的包,它有迁移,但是没有正确命名。我把它命名为 create _ orders _ table,但没有这样的日期。 我把它改成了2021 _ 08 _ 03 _ 000000 _ create _ orders _ table,它很有帮助。

我遇到了这个(误导性的)错误,结果我意外地在迁移类名中省略了单词 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 至圣所(现在内置到 Laravel 8)的一个问题。我已经通过一个包生成了迁移,并且不知怎么地在 vendor\laravel\sanctum\database\migrations中得到了一些东西。

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

详情请参阅 给你

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

优化: 明确

作曲家自动加载转储

如果这些都不能解决问题,那么您已经重命名了从 LaravelCashier 发布的迁移文件。要解决这个问题,可以采取以下措施:

重命名迁移文件,比如2019 _ 01 _ 18 _ 020910 _ create _ role _ table 可以重命名为2019 _ 01 _ 18 _ 020910 _ create _ role _ table

重命名类。像 CreateRoolesTable 这样的东西可以重命名为 CreateRoleTable

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

然后将时间恢复到原来的迁移时间,问题就解决了。

如果您使用的是 Laravel8或更高版本,则可以使用匿名迁移来避免与类名冲突。

下面是如何声明匿名迁移。不要忘记最后的分号。

return new class extends Migration
{
//
};

更多来自 医生