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

Fed*_*are 19 php migration laravel

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

迁移:

在此处输入图片说明

错误: 在此处输入图片说明

班级:

在此处输入图片说明

Mih*_*nde 29

第一个解决方案:

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

例如 : 2019_01_18_020910_create_roles_table.php

2019_01_16_020910_create_roles_table.php

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

因此,CreateRolesTable即使拍号不同,这两种迁移也会有等级。检查您的迁移目录是否有这样的 2 个文件。

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

第二种解决方案:

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

composer install

第三个解决方案

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

第四个解决方案

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

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

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

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


Jas*_*son 19

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

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

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

  • 日期和时间也需要正确格式化:`yyyy_mm_dd_hhmmss_` (4认同)
  • 由于迁移文件没有命名空间,因此它们不使用 PSR-4 自动加载。所以 Laravel 只是“包含”这些文件,并根据文件名猜测其中包含什么类。当迁移中的类不遵循该模式时,我可以看到这是一种可能出错的边缘情况。它可以处理得更好,但它已经像永远这样了,并不急于修复。我认为错误在于 Laravel 不会立即抱怨它在包含迁移文件时找不到所需的类。 (4认同)
  • 这解决了我的问题。但我想强调的是,日期和时间的格式必须正确。起初,它对我不起作用,因为我将文件从 CreateRoleTable.php 重命名为 create_role_table.php。但是当我添加日期和时间时,它起作用了 yyyy_mm_dd_hhmmss_create_role_table.php (2认同)

asc*_*ftw 11

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

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

return new class extends Migration
{
    //
};
Run Code Online (Sandbox Code Playgroud)

更多来自文档


小智 8

请注意迁移文件名。

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

2021-10-13_000000_create_examples_table
Run Code Online (Sandbox Code Playgroud)

但正确的是:

2021_10_13_000000_create_examples_table
Run Code Online (Sandbox Code Playgroud)

哈哈