Php 未找到Laravel基表或视图

Php 未找到Laravel基表或视图,php,laravel,laravel-4,laravel-routing,Php,Laravel,Laravel 4,Laravel Routing,Im my routes.php我有以下内容: <?php Route::group(array(), function () { View::share('roots', Category::roots()->get()); $tree = Category::get()->toHierarchy()->toArray(); View::share('categories', $tree); Route::get('/', array

Im my routes.php我有以下内容:

<?php

Route::group(array(), function () {
    View::share('roots', Category::roots()->get());
    $tree = Category::get()->toHierarchy()->toArray();
    View::share('categories', $tree);

    Route::get('/', array('as' => 'home', 'uses' => 'HomeController@index'));
});

似乎所有的
php artisan
命令都使用
routes.php
文件,因此当您尝试在该文件中访问数据库表(由于未运行迁移,表不存在)时,您将收到此错误。您无法运行
php artisan migrate
,因为您会遇到此错误

一种解决方案是删除查询数据库的代码,但这当然不是一个好的解决方案。所以,您应该做的是从您曾经做过的第一次迁移中选择表(在您的情况下,可能是
类别
。稍后您会有更多迁移,但这将是第一次),并添加类似的内容:

if (!Schema::hasTable('categories'))
{
    return;
}
进入您的
routes.php
文件

但是,如果要更多地使用迁移,并且还需要其他表来查询,则需要将上述条件更改为:

if (!Schema::hasTable('categories') || !Schema::hasTable('users'))
{
    return;
}
但它仍然会导致一些问题-您不希望每次在路由中都运行此代码,因此我会这样做:

if ($env == 'local') {

    if (!Schema::hasTable('categories') || !Schema::hasTable('users'))
    {
        return;
    }
}
当然,您需要配置您的环境。但现在您只在本地环境中运行此代码,在生产环境中不会运行此代码,因此不会影响应用程序性能。当然,我在这里假设你不会在生产中与artisan合作

编辑

但是,如果您仅将查询用于共享数据(而不用于路由),我将移动这些行:

View::share('roots', Category::roots()->get());
$tree = Category::get()->toHierarchy()->toArray();
View::share('categories', $tree);
BaseController
,并在扩展它的所有控制器中运行方法(或父构造函数)

旧答案(在这种情况下不充分)

错误信息在您的解释中已经足够清楚,您的数据库中还没有表。如果没有表,则无法运行数据库查询

在迁移过程中,您应该创建必要的表,例如,这是针对用户表的迁移:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class NewUser extends Migration
{

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function ($table) {
            $table->engine = 'InnoDB';
            $table->increments('id');
            $table->string('user_name', 60)->unique();
            $table->string('email', 120)->unique();
            $table->string('passwd', 256);
            $table->decimal('balance', 8, 2);
            $table->rememberToken();
            $table->timestamps();
        });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
        Schema::drop('users');
    }

}

似乎所有的
php artisan
命令都使用
routes.php
文件,因此当您尝试在该文件中访问数据库表(由于未运行迁移,表不存在)时,您将收到此错误。您无法运行
php artisan migrate
,因为您会遇到此错误

一种解决方案是删除查询数据库的代码,但这当然不是一个好的解决方案。所以,您应该做的是从您曾经做过的第一次迁移中选择表(在您的情况下,可能是
类别
。稍后您会有更多迁移,但这将是第一次),并添加类似的内容:

if (!Schema::hasTable('categories'))
{
    return;
}
进入您的
routes.php
文件

但是,如果要更多地使用迁移,并且还需要其他表来查询,则需要将上述条件更改为:

if (!Schema::hasTable('categories') || !Schema::hasTable('users'))
{
    return;
}
但它仍然会导致一些问题-您不希望每次在路由中都运行此代码,因此我会这样做:

if ($env == 'local') {

    if (!Schema::hasTable('categories') || !Schema::hasTable('users'))
    {
        return;
    }
}
当然,您需要配置您的环境。但现在您只在本地环境中运行此代码,在生产环境中不会运行此代码,因此不会影响应用程序性能。当然,我在这里假设你不会在生产中与artisan合作

编辑

但是,如果您仅将查询用于共享数据(而不用于路由),我将移动这些行:

View::share('roots', Category::roots()->get());
$tree = Category::get()->toHierarchy()->toArray();
View::share('categories', $tree);
BaseController
,并在扩展它的所有控制器中运行方法(或父构造函数)

旧答案(在这种情况下不充分)

错误信息在您的解释中已经足够清楚,您的数据库中还没有表。如果没有表,则无法运行数据库查询

在迁移过程中,您应该创建必要的表,例如,这是针对用户表的迁移:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class NewUser extends Migration
{

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function ($table) {
            $table->engine = 'InnoDB';
            $table->increments('id');
            $table->string('user_name', 60)->unique();
            $table->string('email', 120)->unique();
            $table->string('passwd', 256);
            $table->decimal('balance', 8, 2);
            $table->rememberToken();
            $table->timestamps();
        });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
        Schema::drop('users');
    }

}

你有没有读过,好像你有什么东西试图访问数据库;您是否向artisan添加了任何命令或服务?没有,我没有向artisan添加任何新命令或服务。。。我认为问题不在迁移方面,但你是对的。。。routes.php中的类别需要访问数据库,但如果我只想从命令行运行'php artisan',为什么它会接触routes.php…对于那些由于“migrations”表没有自动创建而最终出现在这里的人,这可能会有所帮助;您是否向artisan添加了任何命令或服务?没有,我没有向artisan添加任何新命令或服务。。。我认为问题不在迁移方面,但你是对的。。。routes.php中的类别需要访问数据库,但如果我只想从命令行运行“php artisan”,为什么它会接触routes.php……对于那些因为“migrations”表没有自动创建而最终出现在这里的人,这可能会有所帮助。@KarolFiturski,迁移中有什么内容?向我们展示代码我添加了迁移源当我简单地调用“php artisan”时也会出现相同的错误,那么为什么这个命令touch routes.php?谢谢这个解决方法工作正常,但是很难看。。。也许在laravel中有另一种跨视图共享数据的方法,所以我不必在routes.php中添加“Category”?@KarolFiturski,那么迁移中有什么?向我们展示代码我添加了迁移源当我简单地调用“php artisan”时也会出现相同的错误,那么为什么这个命令touch routes.php?谢谢这个解决方法工作正常,但是很难看。。。也许在laravel中有另一种跨视图共享数据的方法,这样我就不必在routes.php中添加“Category”了?