【问题标题】:Laravel Migrations with Artisan - 'SQL table does not exists' errorLaravel 迁移与 Artisan - 'SQL 表不存在' 错误
【发布时间】:2014-06-23 18:35:06
【问题描述】:

在为 MySQL 数据库创建和测试迁移文件时,我收到以下错误 -

{"error":{"type":"Illuminate\\Database\\QueryException","message":"SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel.entities' doesn't exist (SQL: select * from `entities`)","file":"\/Applications\/MAMP\/htdocs\/laravel\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Connection.php","line":555}}

没有意义的是我正在使用 artisan 来运行迁移,而我的迁移文件中没有任何内容试图运行 SELECT 查询。

我使用的工匠命令是php artisan migrate(也尝试使用php artisan:resetphp artisan:refresh 进行重置)。

相关迁移文件内容为:

public function up()
    {
            Schema::create('entities', function(Blueprint $table)
            {
                $table->increments('id')->unsigned();
                //..some more columns..
                $table->timestamps();
            }); 
    }

还有其他迁移文件(共 10 个文件),但没有一个对“实体”表有任何依赖。

想弄清楚为什么 artisan 对实体表运行 SELECT 查询而不是创建表?

当我手动创建entities 表时(并添加if (!Schema:hasTable('entities') to bypass the creation of the new table),一切正常,所以我确信其他迁移文件不会导致问题。

配置文件和数据库连接都很好。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 旁注:increments() 函数默认已经使用无符号整数。
  • @André 谢谢,很高兴知道......虽然我仍然在这个问题上苦苦挣扎......知道发生了什么吗?
  • @André 试过了,同样的问题。
  • 还是同样的问题。我什至删除了数据库并创建了一个新数据库。工匠是否尝试运行 app 文件夹中的任何模型/控制器/视图?因为这是我能想到的 SELECT 查询的唯一原因..
  • @Yani 所以迁移本身不是问题。您是否有可能干扰数据库的代码(例如使用DB::listen() 监听数据库事件)?

标签: laravel laravel-4 database-migration


【解决方案1】:

解决方案,在@Andre 的帮助和指点下:

事实证明,Laravel 的工匠依赖于 routes.php 文件,该文件正在调用数据库。虽然有些人会说从routes.php 调用数据库不是最佳做法,但这个项目需要它(我正在使用缓存来减少性能损失) . 以下是导致工匠在进行迁移时崩溃(在 routes.php 中):

foreach (Entities::all() as $entity)
{
}

我可以通过将以下内容添加到 routes.php 文件来绕过它:

if (Schema::hasTable('entities'))
{
    foreach (Entities::all() as $entity)
     {
     }
}

感谢@Andre 的指点!

【讨论】:

  • 谢谢!我从提供者那里调用数据库,工匠也依赖它。
【解决方案2】:

检查您是否在 Kernel.php 或任何其他 laravel 基础文件中添加了任何代码。 artisan migrate 调用路由和内核 PHP 文件。

注释可能查询这些表的方法。

【讨论】:

  • 这应该是评论而不是解决方案。除非您专门告诉用户如何解决他的问题,否则您应该对他的问题发表评论。
【解决方案3】:

遇到同样的问题。

如果您正在使用 ACL(访问控制列表),请检查 authServiceProvider 为您定义门,然后将 if 语句放在它周围,对我有用。

【讨论】:

    猜你喜欢
    • 2014-10-05
    • 2015-03-28
    • 2018-10-03
    • 2023-03-12
    • 2017-06-21
    • 2020-06-28
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多