错误迁移:无法声明 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。
我不知道为什么在执行迁移时会出现此错误,因为我没有重复 类。
迁移:
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。