Я не знаю, почему эта ошибка возникает при выполнении миграции, поскольку у меня нет повторяющихся классов.
Миграции:
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');
}
}
Да все классы разные
это конец урока с замком "}"
композитор дамп-автозагрузка






Первое решение:
Похоже, у вас есть две миграции, выполненные в разное время с практически одинаковым именем.
например: 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 по ошибке.
Четвертое решение :
Возможно, вы установили пакет, который имеет миграцию с тем же именем класса. Чтобы найти бег grep -ril 'createrolestable' vendor
Если он показывает какой-либо файл, то это приводит к тому, что 2 класса имеют одинаковые имена.
Вы можете создать новый php artisan make:migration create_roles_table_custom . а затем скопируйте то, что у вас есть в текущей миграции, в новый и удалите существующий (не из пакета, а тот, который вы создали).
Это создаст класс CreateRolesTableCustom, который отличается от того, что уже есть в пакете.
$ grep -ri 'createrolestable' база данных/база данных миграций/миграции/2019_01_18_020910_create_roles_table.php:класс CreateRolesTable расширяет миграцию
Тогда ваши миграции хороши. можешь сделать второй вариант и бежать composer install ?
да, попробуйте три варианта, и я не смог решить. У меня недавно была проблема, что все миграции были стерты, поэтому мне пришлось их заново создавать, там есть какой-то кеш или что-то в котором хранятся ссылки или что-то в этом роде.
Можете ли вы сделать composer dump-autoload и проверить вывод. Показывает ли он какое-либо предупреждение желтого цвета об этом имени класса. Также проверьте наличие пробелов в конце файла миграции?
composer dump-autoload Создание оптимизированных файлов автозагрузки> Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover Обнаруженный пакет: barryvdh/laravel-debugbar Обнаруженный пакет: brian2694/laravel-toastr Обнаруженный пакет: fideloper/proxy Обнаруженный пакет: laracasts /generators Обнаруженный пакет: laravel/tinker Обнаруженный пакет: nesbot/carbon Манифест пакета сгенерирован успешно. Сгенерированы оптимизированные файлы автозагрузки, содержащие 3512 классов. Предупреждений нет
Это странно, можете ли вы: grep -ril 'createrolestable' vendor установить какой-либо пакет с таким именем класса?
$ grep -ril 'createrolestable' поставщик vendor/uzzal/acl/src/database/migrations/2015_12_22_103904_create_roles_table.php. появляется только этот файл
Ну вот :) У вас уже есть миграция в пакете с таким же именем. Вы можете удалить свою миграцию, создать новую php artisan make:migration create_roles_table_custom . а затем скопируйте то, что у вас есть в текущей миграции, в новую. Это создаст класс CreateRolesTableCustom, который отличается от того, что уже есть в пакете.
Спасибо!!! Не знаю почему он не появляется в поисковике но я пошел по маршруту. Могу ли я удалить эту миграцию плагина? потому что это создает конфликт, потому что я хочу создать таблицу с двойными ролями
Я обновил свой ответ. Удаление миграции плагина — плохая идея, вы можете либо удалить этот пакет, либо сделать то, что я упомянул. У вас уже есть стол roles?
Да, я использую свою таблицу ролей, миграции плагинов их не используют.
вы получите эту ошибку также, если имя класса внутри файла не соответствует имени файла, например, если (имя файла «2019_01_18_020910_create_roles_table.php», а класс — «CreateRoleTable», поскольку вы можете видеть роль слова в имя файла имеет "s" в конце, а имя класса - нет)
Привет @MihirBhende, Да, у меня есть несколько миграций с одним и тем же именем. Должен ли я просто переименовать файл миграции и имя класса? Это приемлемо?
Да что это приемлемо. Но если вас беспокоят обновления имен, вызывающие проблемы с ani, я бы просто скопировал тела методов миграции вверх и вниз и создал новую команду миграции с желаемым именем. А затем вставить его туда. Затем удалите старый
У меня была эта проблема. Я использовал composer dump-autoload, и это решило проблему.
Нет, это не так. Классы миграции не сохраняются Composer как часть его карты классов.
Даже если у вас нет таких файлов с тем же именем класса, и вы все еще сталкиваетесь с той же проблемой, попробуйте
composer dump-autoload
Как и другие данные ответы, эта ошибка также может произойти, если имя файла миграции не является версией имени класса в змеином регистре.
Таким образом, файл миграции 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
В моем случае у меня был собственный пакет с миграцией, и он не был правильно назван. Я назвал его без даты следующим образом: 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
У меня была такая же проблема при переносе пользовательского пакета, где я добавил имя класса, чтобы оно выглядело как CmsCreateFailedLoginAttemptsTable, но должно было быть CreateCmsFailedLoginAttemptsTable
Будьте осторожны с именем файла миграции.
Для меня имя файла миграции было:
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", чтобы сохранить стандартные миграции.
Подробнее см. в здесь.
Это может быть вызвано рядом причин. Выполните следующие действия, чтобы решить проблему. Сначала запустите эту команду в терминале
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, моя временная последовательность верна, но он все еще вызывает проблему с именем.
Затем я возвращаю время обратно к исходному времени миграции, и проблема решена.
Вы проверили все имена классов? Они не обязательно совпадают с именами файлов.