Laravel ModelNotFoundException: нет результатов запроса для модели [] - PullRequest
2 голосов
/ 26 апреля 2019

Я получаю эту ошибку при запуске теста:

ModelNotFoundException: нет результатов запроса для модели [App \ Content]

Вот мой тест:

/** @test */
public function it_loads_homepage()
{
    $this->withoutExceptionHandling();
    $response = $this->get('/');

    $response->assertStatus(200);
}

Вот мой контроллер:

public function home()
{
    $topbar = Content::where('slug', 'topbar')->firstOrFail();

    return view('welcome')->with([
        'logo' => Arr::get($topbar->content, 'logo', asset('images/logo.png')),
        'quote' => Arr::get($topbar->content, 'quote'),
        'quote_author' => Arr::get($topbar->content, 'quote_author')
    ]);
}

Вот мой файл маршрутов:

Route::get('/', 'PageController@home');

Route::post('/admin/content', 'ContentsController@store');

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

Route::middleware('auth')->prefix('admin')->group(function () {
    Route::get('/dashboard', 'DashboardsController@index');
    Route::patch('/contents/{content}', 'ContentsController@update');
});

Если у кого-нибудь есть идеи о том, как помочь, это будет высоко оценено, спасибо!

P.S. Если мне нужно добавить что-нибудь еще, пожалуйста, дайте мне знать Спасибо!

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

Исключение говорит вам, что нет объекта Content, который соответствует условию.Из документов :

Исключения не найдены

Иногда вы можете вызвать исключение, если модель не найдена.Это особенно полезно в маршрутах или контроллерах.Методы findOrFail и firstOrFail будут получать первый результат запроса;однако, если результат не будет найден, будет выдан Illuminate\Database\Eloquent\ModelNotFoundException.

Проверьте ваше where условие:

$topbar = Content::where('slug', 'topbar')->firstOrFail();

Убедитесь, что у вас есть запись в вашемcontents (?) Таблица с slug=topbar (помните, что она чувствительна к регистру).В одном из ваших комментариев вы сказали, что уверены, поэтому проверьте его в Artisan Console , используя Tinker :

$ php artisan tinker
> Content::where('slug','topbar')->count();

Это должно привести к выводу:

[!] Псевдоним 'Использование' для 'App \ Content' для этого сеанса Tinker.

=> 1 // или, может быть, больше ..

Комуполучите ваши записи, которые вы можете попробовать вместо этого (в своем контроллере):

$topbar = Content::where('slug', 'LIKE', '%topbar%')->firstOrFail();

Кроме того, очень вероятно, что ваше предложение является просто примером вашего текущего кода, но если нет, обязательно передайте фактическоезначение в вашем предложении where:

$topbar = Content::where('slug', 'LIKE', request('slug'))->firstOrFail();
1 голос
/ 26 апреля 2019

Метод find () из построителя запросов может возвращать экземпляр модели или значение NULL, если в базе данных не найдено ни одной записи.Таким образом, вы должны справиться с этим, проверив сначала, существует ли пользователь.Если он это сделает, вы можете, например, показать его аватар, в противном случае вы можете показать кнопку входа в систему.

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

$topbar = Content::where('slug', 'topbar')->get()->toArray();

return view('welcome')->with([
    'logo' => Arr::get($topbar->content, 'logo', asset('images/logo.png')),
    'quote' => Arr::get($topbar->content, 'quote'),
    'quote_author' => Arr::get($topbar->content, 'quote_author')
]);
...