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

时间:2019-02-19 11:52:13

标签: php laravel migration

我不知道执行迁移时为什么会跳此错误,但是我没有重复的类。

迁移:

enter image description here

错误: enter image description here

班级:

enter image description here

7 个答案:

答案 0 :(得分:6)

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

因此迁移文件 ('B4', 'B9', '4') ('B1', 'B3', '8') ('B5', 'B6', '1') ('B7', None, '4') ('B8', 'B9', '5') ('B12', 'B19', '6') ('B17', 'B24', '3') ('B22', 'B23', '3') ('B24', 'B29', '8') ('B30', 'B31', '10') ('B32', 'B39', '12') ('B45', 'B47', '12') ('B48', 'B49', '15') ('B50', None, '14') ('B17', 'B18', '18') ('B41', 'B42', '19') 必须包含类 2019_01_18_020910_create_roles_table.php。如果它包含类 CreateRolesTable,但缺少 CreateRoleTable,则会引发“无法声明 X...”错误。我在 Laravel 8 上发现了这个,可能适用于早期版本。

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

答案 1 :(得分:1)

第一个解决方案:

似乎您在不同的时间进行了两次迁移,并且名称基本相同。

例如:2019_01_18_020910_create_roles_table.php

2019_01_16_020910_create_roles_table.php

Laravel将转换该文件名,以消除日期签名,并用Camel Casing其余文本。

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

要对此进行检查,请从项目根目录grep -ri 'createrolestable' database/migrations的终端运行

第二个解决方案:

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

运行composer install

第三种解决方案

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

第四种解决方案

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

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

composer dump-autoload

答案 4 :(得分:0)

对我来说,问题是生成的错误文件与旧迁移之一使用相同的类名,这导致迁移命令在尝试重新编译之前生成的其他迁移文件时失败。

一旦我删除了其中一个文件,我的新迁移就成功且顺利地创建了。

答案 5 :(得分:0)

如果你想要自定义迁移,你也可以添加到你的 AppServiceProvider

git rebase --continue

https://laravel.com/docs/8.x/billing#introduction

答案 6 :(得分:0)

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