2016-12-13 6 views
0

Laravel 5.3Ручка Laravel 5.3 QueryException?

Я знаю, что происходит. В моей загрузке функции AppServiceProvider У меня есть код, который разделяет данные для всех просмотров:

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

Но, если нет такой таблицы (после сброса DB), который бросает исключение

[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-artisan работают нормально.

Я попытался следующие:

 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

Это не хорошее использование поставщиков услуг, которые, как правило, предназначены для загрузки потребностей вашего приложения, такие как 3-пакетов сторонних производителей. Как вы можете видеть, размещение запросов для обмена данными с представлениями неэффективно в поставщике услуг, поскольку они выполняются буквально с каждым единственным запросом (зачем ему нужно запускать этот запрос, если вы просто используете консоль?)

Вместо этого вы должны поместить этот код в промежуточное программное обеспечение, учитывая, если вы также должны принять совет Роберта Тшебиньского и поместить его в композитора представления также внутри этого промежуточного программного обеспечения.