Laravel迁移时出现致命错误:找不到类

22
  1. 我运行了artisan migrate:reset

  2. 我删除了一些迁移文件,因为我不再需要这些表格。

  3. 我依次运行了composer dump-autoloadartisan dump-autoload

  4. 我运行artisan migrate,但是一直收到以下错误:

    PHP致命错误:/vagrant/LaravelBackend/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php中的类'Foo'未找到,位于第297行

我尝试过:

  • 重新运行composer dump-autoloadartisan dump-autoload(还使用了artisan clear-compiled

  • 删除迁移表并运行artisan migrate:install

  • 删除vendor和composer.lock文件并运行composer install

  • 在PHPStorm中搜索Foo类。 没有找到任何内容。

    我仍然收到相同的错误。 这是4.2更新以来我第一次运行它,是否相关?我应该寻找其他东西吗?


@TheShiftExchange 我已经从数据库中删除了所有的表格。我的迁移是“独立”的,它们不需要任何其他迁移。另外,我最近升级到了4.2版本,如果有可能与此有关... - Wistar
我曾经遇到过这个问题,但我不记得我是如何解决它的。如果我是你,我会删除所有的迁移,然后逐个添加,直到错误再次出现。 - Laurence
@TheShiftExchange 我会尝试的。谢谢。 - Wistar
@Kryten 我在那里没有看到任何明显的问题,但我会继续查找。谢谢。 - Wistar
请尝试使用 artisan clear-compiled 命令,然后再执行 dump autoload - Jarek Tkaczyk
显示剩余4条评论
11个回答

39

我也遇到过这个问题。 必须记住:类名必须与文件名相一致。 简单的文件重命名就可以解决问题 :)

例如:在文件"2014_12_08_100923_create_items_tables.php"中,必须使用CamelCase单词编写名称为"CreateItemsTables"的类。


1
到处都可以看到dump-autoload解决方案,但没有人解释这个。谢谢! - keisar
4
你需要遵循日期格式前缀 https://dev59.com/1GAf5IYBdhLWcg3wqEHp#35265489。请将其翻译成中文,并保持原文意思不变,简洁易懂,不得添加解释或其他信息。 - xatzistnr
2
这实际上是解决问题的答案(+ @xatzisnr 的评论)。被接受的答案只是一个解决方法(=重新开始/重做一切)。如果您手动重命名迁移PHP文件,您还需要composer dump-autoload - eightyfive

27

我通过以下步骤解决了我的问题:

  1. 删除所有迁移
  2. 执行composer dump-autoload
  3. 逐个添加迁移,每添加一个就运行php artisan migrate
  4. 删除导致Laravel抛出错误的迁移
  5. 创建新的迁移来替换已删除的迁移

我不确定为什么这个方法有效,但我的猜测是我之前可能修改了这些问题迁移的类名。

我还发现,对于其中一些迁移,将其重命名为其初始名称(抛出致命错误的名称)也可以起作用。


4
看起来现在应该使用 composer dump-autoload 而不是 artisan。(Laravel 5) - Nadav S.
1
记得这些文件名!它们必须匹配。请参考Juljan的答案。 - Captain Hypertext
虽然这应该由Taylor Otwell和他的团队解决,但它像魔法一样运作。我找到了问题的根源和解决方案。这应该在下一个补丁中得到解决:https://dev59.com/Ol0Z5IYBdhLWcg3w_0l8#31201694 - clusterBuddy

13
我也遇到了这个问题,解决方法与以上所有方法都不同。失败的原因是数据库中的迁移表仍然提到了文件名。由于没有唯一列,我无法使用PHPMyAdmin删除它,只能采取CLI方式。
作为root用户登录到您的服务器上。 输入以下内容:
mysql -p database_name

现在它会提示您输入密码。从这里开始,所有内容都以mysql >开头,这只是表示您已进入Mysql环境。

select * from migrations;

寻找你删除的迁移文件并复制文件名。

delete from migrations where migration = '2015_07_21_000119_create_some_table';

它应该提到有1行受影响。现在通过再次输入第一个命令来验证它是否已经消失:

select * from migrations;

如果它已经消失,请输入命令退出Mysql环境

exit;

现在再试一次 'php artisan migrate:rollback',它应该能够完美地工作 :-)


这也是我的解决方案。问题在于我已经删除了一个迁移文件,但是迁移表仍然有一行记录它,并且migrate:refresh正在尝试回滚该文件。 - QuickDanger

7
实际解决方案是正确命名翻译。您可能还需要执行 composer dump-autoload 迁移文件必须采用以下格式: YYYY_MM_DD_000000_create_some_table.php 其中内部的类名必须为: class CreateSomeTable extends Migration {}

这就是让我困扰的地方 - 我需要在文件名中加入“000000”,突然间我的“找不到类SoftDelete”的错误消失了,我的迁移工作完美地完成了。 - Scott Salyer

4

我知道这可能有点过时了,但实际上有更好的方法。在终端中运行以下命令,并随意删除其中的任何一个:

~$ php artisan clear-compiled;php artisan cache:clear;php artisan config:clear;php artisan debugbar:clear;php artisan view:clear;php artisan optimize

为了定期执行此任务,创建一个名为 artisan-clear 的可执行文件:
#!/bin/bash

php artisan clear-compiled
php artisan cache:clear
php artisan config:clear
php artisan debugbar:clear
php artisan view:clear
php artisan optimize

4

有一种更简单的方法。

  1. 手动重新创建那些被删除的迁移。 artisan make:migration
  2. 运行 artisan migrate:reset 进行回滚
  3. 删除刚刚创建的那些虚拟迁移文件。
  4. 运行 artisan migrate:refresh

1
我是这样做的: 1. 从数据库中删除了不存在迁移的行 2. 运行命令 php artisan migrate:refresh
这有助于解决我的问题。
*所有数据将从数据库表中删除

1
对我来说,解决方案是迁移中我的类名某种方式以小写字母开头。当我将类名更改为全部大写时,然后运行composer dump-autoload,它最终适用于我。这是使用Laravel 5.1实现的,如果有价值的话。

1

版本 5.1.3 出现了同样的问题,我解决了:

  • 删除所有表中的数据库
  • 运行命令:php artisan migrate:status

输出:No migrations found. 好的,继续执行以下命令:

  • php artisan migrate:install
  • php artisan migrate

输出结果为:

Migrated: 2016_11_24_093015_dt_some_table
Migrated: 2016_12_05_141004_dt_some_table
Migrated: 2016_12_07_110518_dt_some_table
Migrated: 2016_12_08_141807_dt_some_table
Migrated: 2016_12_13_090832_dt_some_table

这个问题已经解决。

0

我也遇到了同样的问题。当我运行 php artisan migrate:reset 时,出现了 Class 'CreateImagesTable' not found 的错误。而且 composer dump-autoload 也没有帮助。

我的解决方案非常简单:

  1. php artisan make:migration create_images_table --create=images
  2. composer dump-autoload
  3. 然后我得到了以下信息: SQLSTATE[HY000]: General error: 1 no such table: images (SQL: drop table "images")
  4. 所以在 sqlite 中我输入了: CREATE TABLE `images` ( ...> `id` INTEGER ...> );
  5. 然后运行 php artisan migrate:reset
  6. 现在我又开心了

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接