2016-12-13 5 views
0

ララベル5.3Handler Laravel 5.3 QueryException?

私は何が起こるか知っています。 AppServiceProviderの私のブート機能では、私はすべてのビューのためのデータを共有するコードがあります、それは例外をスローします(DBリセット後)はそのようなテーブルが存在しない場合は、

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

をしかし

[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 

の場合私は、ブート機能のコードは、それは大丈夫ですコメント、すべてのPHPの職人のコマンドは正常に動作しています。

私は次のことを試してみました:

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

それは同じエラーをスローします。私もこれを試しました:

if (Schema::hasTable('messages')){ 

しかしそれは何も共有しません。

どうすれば対応できますか?

+0

'Schema :: hasTable( 'messages')'の出力は何ですか? –

+0

出力がない、スキップする、つまりそのようなテーブルがないことを意味するので、共有データクエリが失われた。 – BonBonSlick

答えて

0

ビューコンポーザーを使用すると、プロバイダがロードされたときにクエリが即座に実行されないようにすることができます。ビューコンポーザーを登録すると、ビューが実際にそれを必要とするときにのみクエリが実行されます。

続きを読む:https://laravel.com/docs/5.2/views#view-composers

+0

AppServiceProviderにこのような問題があることが分かっていれば大変感謝しています...私はComposerServiceProviderを使用します。 – BonBonSlick

0

は、これは一般的に、このようなサードパーティ製のパッケージなどのアプリの要件をブートストラップすることを意図しているサービスプロバイダの良い使用ではありません。ご覧のとおり、ビューを使用してデータを共有するためのクエリを配置することは、文字通りすべての単一の要求で実行されるため、効率的ではありません(なぜコンソールを使用している場合はそのクエリを実行する必要がありますか?)

代わりに、このコードをミドルウェアに置き、RobertTrzebińskiのアドバイスを取ってそのミドルウェアのビューコンポーザーに入れるべきかどうかを検討する必要があります。