【问题标题】:Error migrations: Cannot declare class X, because the name is already in use错误迁移:无法声明类 X,因为该名称已在使用中
【发布时间】:2019-07-12 22:12:09
【问题描述】:

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

迁移:

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

【问题讨论】:

  • 你检查了所有的类名吗?它们不一定与文件名匹配。
  • 是的,所有的课程都不一样
  • 用钥匙锁“}”的课程结束
  • 作曲家转储-自动加载

标签: php laravel laravel-migrations


【解决方案1】:

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

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

return new class extends Migration
{
    //
};

更多来自Docs

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      php 工匠优化:清除

      作曲家转储自动加载

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

      重命名迁移文件。像 2019_01_18_020910_create_roles_table 这样的东西可以重命名为 2019_01_18_020910_create_role_table

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 日期和时间也需要正确格式化:yyyy_mm_dd_hhmmss_
        • 谢谢!我想知道这不是常识,或者为什么错误消息不是很清楚
        • 由于迁移文件没有命名空间,它们不使用 PSR-4 自动加载。所以 Laravel 只需 includes 文件并根据文件名猜测其中的类。当迁移中的类不遵循模式时,我可以看到这是一个可能出错的边缘情况。它可以处理得更好,但它永远都是这样,并不急于修复。我认为这个错误是 Laravel 没有立即抱怨它在包含迁移文件时没有找到它期望的类。
        • 你拯救了我的一天♥@Jason
        • 这解决了我的问题。但我想强调的是,日期和时间的格式必须正确。起初,它对我不起作用,因为我将文件从 CreateRoleTable.php 重命名为 create_role_table.php。但是当我添加日期和时间时,它起作用了 yyyy_mm_dd_hhmmss_create_role_table.php
        【解决方案5】:

        对我来说,这是 Laravel Sanctum(现在内置在 Laravel 8 中)的问题。我通过一个包生成了迁移,并以某种方式在vendor\laravel\sanctum\database\migrations 中得到了一些东西。

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

        详情请见here

        【讨论】:

          【解决方案6】:

          注意迁移文件名。

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

          2021-10-13_000000_create_examples_table
          

          但正确的是:

          2021_10_13_000000_create_examples_table
          

          哈哈

          【讨论】:

          • 还要小心命名空间,我遇到的另一个问题是因为添加了命名空间。
          • OOO MMM GGG - 这里也一样 :-) 搜索并尝试了 1 1/2 小时 - 谢谢老兄:-)
          【解决方案7】:

          我遇到了这个(误导性的)错误,结果我不小心从迁移类名称中省略了 Create 这个词。

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

          不正确:class FooTable extends Migration

          正确:class CreateFooTable extends Migration

          【讨论】:

          • 我在自定义包迁移中遇到了同样的问题,我在类名前面加上了类名,所以它看起来像 CmsCreateFailedLoginAttemptsTable 但需要是 CreateCmsFailedLoginAttemptsTable
          【解决方案8】:

          在我的情况下,我有自己的包,它有迁移并且没有正确命名。我将它命名为没有日期,如下所示:create_orders_table。 我将其更改为 2021_08_03_000000_create_orders_table 并有所帮助。

          【讨论】:

            【解决方案9】:

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

            composer dump-autoload
            

            【讨论】:

              【解决方案10】:

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

              【讨论】:

              • 不,它没有。 Composer 不会将迁移类存储为其类映射的一部分。
              【解决方案11】:

              第一个解决方案:

              您似乎在不同时间完成了 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 的内部类自动加载会导致此问题。执行以下操作以检查是否解决:

              运行composer install

              第三种解决方案

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

              第四个解决方案

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

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

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

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

              【讨论】:

              • $ grep -ri 'createrolestable' database/migrations database/migrations/2019_01_18_020910_create_roles_table.php:class CreateRolesTable extends Migration
              • 那么你的迁移是好的。你能做第二个选项并运行composer install 吗?
              • 是的,尝试三种替代方案,但我无法解决。我最近遇到了一个问题,所有迁移都被删除了,所以我不得不重新创建它们,有一些缓存或存储引用的东西或类似的东西。
              • 你能做composer dump-autoload 并检查输出。它是否显示任何关于此类名称的黄色警告。还要检查迁移文件末尾的空格吗?
              • 这很奇怪,你能不能:grep -ril 'createrolestable' vendor 如果你安装了任何具有这个类名的包?
              猜你喜欢
              • 2018-06-28
              • 2019-08-23
              • 2021-08-17
              • 2020-06-21
              • 2023-03-10
              • 2016-11-03
              • 2020-03-20
              • 2020-10-10
              • 2023-03-14
              相关资源
              最近更新 更多