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

时间:2019-04-26 19:46:49

标签: php mysql laravel artisan

运行测试时出现此错误:

  

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 个答案:

答案 0 :(得分: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 :(得分:1)

该异常告诉您不存在符合条件的Content对象。来自docs

  

未找到异常

     

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

检查您的where条件:

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

确保在contents(?)表中有slug=topbar的记录(请记住,这是区分大小写的)。您在其中一项评论中说您确定,因此请使用Artisan ConsoleTinker中进行检查:

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

这应该输出:

  

[!]在此修补程序会话中将“用法”别名为“ App \ Content”。

     

=> 1 //或更多。

要获取记录,您可以改用此方法(在您的控制器中):

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

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

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