处理Laravel 5.3 QueryException?

时间:2016-12-13 16:36:29

标签: php laravel laravel-5 laravel-5.2

Laravel 5.3

我知道会发生什么。在我的AppServiceProvider的启动功能中,我有代码共享所有视图的数据:

&

但是,如果没有这样的表(在DB重置之后),则抛出异常

 $unread_messages = count(Message::where('status', 0)->get());
    View::share('unread_messages', $unread_messages);

如果我在启动功能中注释该代码,那就没关系,并且所有php artisan命令都正常工作。

我尝试了以下内容:

    [Illuminate\Database\QueryException]
  SQLSTATE[42S02]: Base table or view not found: 1146 Table 'lara53.messages' doesn't
   exist (SQL: select * from `messages` where `status` = 0)

  [PDOException]
  SQLSTATE[42S02]: Base table or view not found: 1146 Table 'lara53.messages' doesn't
   exist

它会抛出相同的错误。我也试过这个:

     try
      {
        $unread_messages = count(Message::where('status', 0)->get());
        View::share('unread_messages', $unread_messages);
} catch (Exception $e)
      {
         $e->getMessage();
      }

但它没有任何共享。

我该如何处理?

2 个答案:

答案 0 :(得分:0)

您可以使用视图编辑器,以便在加载提供程序时不会立即执行查询。而是注册视图编辑器,只有在视图实际需要时才会执行查询。

了解详情:https://laravel.com/docs/5.2/views#view-composers

答案 1 :(得分:0)

这不是对服务提供商的良好使用,服务提供商通常用于引导应用程序的需求,例如第三方软件包。正如您所看到的,将查询与视图共享数据在服务提供者中效率不高,因为它们在每个单一请求上运行(如果您只是使用控制台,为什么还需要运行该查询?)

相反,您应该将此代码放入中间件,同时考虑是否应该采用RobertTrzebiński的建议并将其放在视图编写器中以及该中间件内部。