Модель, ошибка базы данных в Laravel

Я создаю приложение в Laravel 4, чтобы помочь мне учиться и совершенствоваться при создании приложений с помощью PHP, Blade и Laravel. Ключевыми функциями приложения являются обмен сообщениями, которые я пытаюсь добавить в приложение с пакетом, доступным в GitHub. Пакет – Laravel-Messenger от CMYGYR: https://github.com/cmgmyr/laravel-messenger . Проблема, с которой я сталкиваюсь, заключается в том, что я получаю ошибку, связанную с запросом базы данных, сделанным одной из моделей.

Я считаю, что мой контроллер правильно настроен, потому что функции __construct() , index и create работают нормально. Это в функции show моего findOrFail где метод findOrFail является началом проблемы:

Пространства имен контроллера

Функция отображения контроллера

Я считаю, что модель Thread правильно настроена для взаимодействия с соответствующей таблицей в базе данных:

Конфигурация модели резьбы

Но затем я получаю эту ошибку ModelNotFoundException, когда оператор Thread::findOrFail($id) функции show запрашивает таблицу тем:

Ошибка MNFE

Однако, когда я использую MySQL Workbench для просмотра строк таблицы thread , я могу видеть информацию, которую должна show правильная функция контроллера:

Строки таблицы резьбы

Я ценю любую помощь по этой проблеме.


Поэтому я сделал некоторую дополнительную работу над моим проектом, пытаясь выяснить проблемы, и после некоторого тестирования я обнаружил, что проблема определенно не в том, что записи в моей базе данных не существуют. Разумеется, модель (в данном случае Thread ) не найдена по какой-либо причине.

Поэтому оператор findOrFail в функции show моего findOrFail был основным виновником, когда я начал тестировать. Чтобы проверить, как мое приложение реагирует на изменения, я заметил, что произошло в моем браузере и в консоли разработчика, которую я подключил к моему приложению для таких проблем. Я попробовал 3 отдельных решения, которые я объясню и предоставит скриншоты. Предупреждение: это не для слабонервных.

1) $thread = DB::select('select * from threads where id = id', []);

Проблема с этим утверждением (который я написал для замены $thread = Thread::findOrFail($id); ) – он возвращает массив, который не может вызвать функцию модели Thread. Несмотря на правильное выполнение запросов в базе данных, он не может использоваться для вызова функции usersUserIds, которая находится в модели Thread .

Редактор-1Консоль-1Браузер--

2) $thread = Thread::find($id);

Проблема с этим оператором find заключается в том, что он возвращает null , потому что проблема заключается в том, что модель не найдена.

Редактор-2Консоль-2Браузер-2

2) $thread = DB::table('threads')->where('id', $id)->first();

Этот оператор возвращает stdClass object , который (несмотря на то, что объект имеет все правильные данные в нем) не может вызывать ни один из методов модели Thread , поскольку он не является моделью Thread .

Редактор-3Консоль-3Браузер-3

Если вы читали это далеко, вы ангел. Как всегда любая помощь со стороны сообщества SO очень ценится.

Ваша проблема не в том, что автозагрузчик не был обновлен, но вы запрашиваете запись в своей базе данных, которая не существует.

Вы используете метод Eloquent::findOrFail() . Если Thread в указанном $id не найден в базе данных, findOrFail() выдает исключение ModelNotFoundException (см. http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Builder.html#method_findOrFail – " Найти модель по ее первичному ключу или выбросить исключение. ")

Если это единственная ошибка, которую вы получаете, ваш код работает нормально. Ваша база данных, вероятно, просто пуста. Используйте сеялку базы данных, чтобы заполнить строки и уловить ошибку в коде:

 public function show($id) { try { $thread = Thread::findOrFail($id); } catch(\Illuminate\Database\Eloquent\ModelNotFoundException $e) { // throw some error here return View::make('messenger.invalid-thread'); } $userId = Auth::user()->id; $users = User::whereNotIn('id', $thread->participantsUserIds($userId))->get(); $thread->markAsRead($userId); return View::make('messenger.show', compact('thread', 'users')); } 

В связи с этим обратите внимание, что вы выполняете миграцию базы данных, необходимую для использования указанного вами пакета? Попробуйте php artisan migrate --package=cmgmyr/messenger ; но я подозреваю, что вы уже это сделали, если не получаете недостающую ошибку таблицы .