Я создаю приложение в 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 запрашивает таблицу тем:
Однако, когда я использую 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
.
2) $thread = Thread::find($id);
Проблема с этим оператором find
заключается в том, что он возвращает null
, потому что проблема заключается в том, что модель не найдена.
2) $thread = DB::table('threads')->where('id', $id)->first();
Этот оператор возвращает stdClass object
, который (несмотря на то, что объект имеет все правильные данные в нем) не может вызывать ни один из методов модели Thread
, поскольку он не является моделью Thread
.
Если вы читали это далеко, вы ангел. Как всегда любая помощь со стороны сообщества 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
; но я подозреваю, что вы уже это сделали, если не получаете недостающую ошибку таблицы .