Laravel 4迁移回滚问题


73

我可以轻松地运行artisan migration等,但是当我尝试使用Migration:rollback将其回滚时,我一直收到此错误,

c:\xampp\htdocs\laravel>php artisan migrate:rollback
{"error":{"type":"Symfony\\Component\\Debug\\Exception\\FatalErrorException","message":"Class 'CreateCodesnippetsTable' not found","file":"C:\\xampp\\htdocs\\laravel\\vendor\\laravel\\framework\\src\\Illum
inate\\Database\\Migrations\\Migrator.php","line":301}}

这是一个错误吗?或者我应该如何调试呢?


请提供迁移文件,以供您尝试回滚的迁移
Marco Rivadeneyra 2013年


您的CodeSnippetsMigration文件如何命名?您是否碰巧手动更改了此名称或类名?
rmobis

1
我遇到了同样的问题。但是在我的情况下,它在migration:reset / migrate:refresh上失败。问题是,我删除了一个迁移文件,但表迁移仍包含此文件的条目,因此由于未找到类错误,技术人员无法回滚此迁移。我从迁移表中删除了该条目,并且工作正常。
DeyyyFF 2014年

Answers:


177

也许您已经解决了这个问题。但是我注意到由于某种原因,回滚通常需要您先运行composer dumpautoload。即使您的迁移有效。


2
该文档缺少此花絮。(laravel.com/docs/migrations#rolling-back-migrations
erj1

5
你翻转天才。我骗了一个小时。
al_manchester

为什么我们需要运行composer dumpautoload?
穆罕默德

1
我们需要作曲家dump-autoload,因为迁移只是一堆类,它们是在向上/向下运行它们的过程中自动加载的。但是,php artisan dump-autoload没有显示composer.json错误,而composer dump-autoload却显示了错误。
Dmitriy Sintsov

就我而言,我还没有在这台机器上安装作曲家。(重新安装linux时,复制了整个目录。)因此,在migration:make运行dump-autoload时,由于我没有作曲家,因此它不在本地计算机上执行。安装作曲家和运行转储自动加载工作。
达斯汀·格雷厄姆

37

经过数天的努力,我现在可以提供解决该问题的明确答案。是的,我知道会打个电话,但请耐心等待。

如果遇到此问题,第一个呼叫端口将运行composer dump-autoload。这应该导致文件的更新版本vendor/composer/autoload_classmap.php

如果autoload_classmap.php没有更新,则可能是权限问题,在这种情况下,您可以尝试sudo composer dump-autoload

但是,如果 autoload_classmap.php 确实得到更新,请检查它是否包含您的迁移类的条目(在本例中为CreateCodesnippetsTable)。如果没有此类的条目,则应检查composer.json文件并确保该app/database/migrations文件夹包含在自动加载部分中,例如:

"autoload": {
    "classmap": [
        "app/controllers",
        "app/models",
        "app/database/migrations"
    ]
},

最后一点是我搞砸了。在错误地优化事物的尝试中,我composer.json天真地从文件中拉出了尽可能多的内容,天真地认为这只会影响Web请求。事实证明,这也影响了这名工匠,因此重新启用这条生产线并composer dump-autoload为我解决了问题。

最后,如果所有失败,则可能是其中一个支持库中的错误导致了该问题,在这种情况下,您可以尝试使用composer update或其中的一些变体进行更新。但是,我怀疑这很少会成为问题的真正原因。


2
缺乏自动加载更改也可能意味着语法错误composer.json。您将知道composer dump-autoload在主项目上运行时,但在运行时php artisan dump-autoloadcomposer.json不会警告工作台中的语法错误。如果您的工作台项目进展顺利,请cd加入其中并尝试composer dump-autoload单独运行。
Tomas Buteler 2014年

13

如果您在Windows中,只需在终端/命令行实用程序中使用composer并执行以下操作:

composer dump-autoload

希望能帮助到你!


8

从我所看到的,我猜测您已经手动更改了类名。在错误中您有类名CreateCodesnippetsTable但是在您提供的迁移文件(pastebin)中,类名是CreateCodeSnippetsTable(请注意,代码段中的S,我想这是您手动更改的)。

如果您检查数据库中的迁移表,则将看到每次迁移的记录。当您创建迁移时,它将以该名称保存在数据库中,并且回滚方法尝试使用数据库中提供的名称读取文件,以防万一,在您手动更改时,laravel找不到该类,并且错误。

要解决此问题,您可以撤消更改,然后尝试回滚或手动编辑数据库中的迁移行以包含正确的类名。

希望这可以帮助。



4

我通过运行修复了它

composer.phar update


不需要更新依赖项,因为唯一需要做的就是转储自动加载的文件并在更新时重新生成它们,因此最终也完成了此任务,但是如果不需要的话,不需要进行依赖项的完整更新。只需运行命令“ composer dumpautoload”或“ composer.phar dumpautoload”,然后重试。
Rohwedder 2014年

2

从laravel网站下载composer.phar文件,并将composer.phar文件带到laravel文件夹的根目录

然后从终端进入laravel的根目录并运行composer.phar update 或简单地运行php artisan dump-autoload


1

我遇到了同样的问题并找出了问题

我创建了一个迁移,用于在PatientReasonOfVisits表中添加新的列日期,当我创建迁移时,我使用laravel生成器,类名是

class AddDateToPatientReasonOfVisitsTable

确保在创建新的迁移文件后,您需要运行composer dump-autoload以确保该文件在类映射文件中列出

文件名是2014_09_02_214134_add_date_to_ Patientreasonofvisitstable.php

迁移成功完成,并且新记录已添加到迁移表中。在迁移列中使用文件名

当我回滚迁移时,我找不到类,但找不到该类的类

AddDateToPatientreasonofvisitsTable

注意:类名之间的区别

为什么以及如何解决此问题,我猜想当您回滚使用迁移文件名解析的类名时,在迁移表中大写和小写字母由文件名中的下划线“ _”决定

因此,在将迁移文件重命名为2014_09_02_214134_add_date_to_ Patient_reason_of_visits_table.php后,请确保在重命名文件后运行composer dump-autoload,类别名称正确解析,无一例外


0

我只是删除了迁移表,然后运行 php artisan migrate:refresh

然后,所有迁移都能够执行,不确定这是否是最好的方法,但是它对我有用。

我正在运行Laravel 5。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.