Laravel ModelNotFoundException:没有模型[]的查询结果

问题描述 投票:2回答:2

我在运行测试时遇到此错误:

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');
});

如果有人对如何提供帮助有任何想法,我将不胜感激,谢谢!

附:如果我需要包含其他任何内容请告诉我,谢谢!

php mysql laravel artisan
2个回答
1
投票

查询构建器中的find()方法可以返回Model实例,如果在数据库中找不到记录,则返回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')
]);

1
投票

该异常告诉您没有与条件匹配的Content对象。来自docs

Not Found Exceptions

有时,如果找不到模型,您可能希望抛出异常。这在路线或控制器中特别有用。 findOrFailfirstOrFail方法将检索查询的第一个结果;但是,如果没有找到结果,将抛出Illuminate\Database\Eloquent\ModelNotFoundException

看看你的where条件:

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

确保你的contents(?)表中有slug=topbar记录(记住这是区分大小写的)。你在你的一条评论中说过你确定,所以请使用Artisan ConsoleTinker中查看:

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

这应输出:

[!]为此Tinker会话别名'使用'到'App \ Content'。

=> 1 //或者更多..

要获取您的记录,您可以尝试(在您的控制器中):

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

此外,您的句子很可能只是当前代码的示例,但如果没有,请确保在where子句中传递实际值:

$topbar = Content::where('slug', 'LIKE', request('slug'))->firstOrFail();
© www.soinside.com 2019 - 2024. All rights reserved.