【问题标题】:Laravel ModelNotFoundException: No query results for model []Laravel ModelNotFoundException:没有模型[]的查询结果
【发布时间】:2019-09-16 08:24:42
【问题描述】:

运行测试时出现此错误:

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

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

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

【问题讨论】:

  • Content::where('slug', 'topbar')->firstOrFail(); or fail 部分正在抛出异常。确保测试时记录存在。
  • 是的,测试只是确保页面加载返回 200 状态代码。我已验证该记录确实存在。

标签: php mysql laravel laravel-artisan


【解决方案1】:

查询构建器的 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')
]);

【讨论】:

  • 内容分贝表有一个存储 JSON 的内容列。这个逻辑在我的控制器中而不是在我的视图中。
  • JSON 包含记录的所有数据
【解决方案2】:

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

未发现异常

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

查看您的where 条件:

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

确保您的contents (?) 表中有一条记录为slug=topbar(请记住这是区分大小写的)。您在其中一个 cmets 中说您确定,因此请使用 TinkerArtisan Console 中检查它:

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

这应该输出:

[!] 将此 Tinker 会话的“Usage”别名为“App\Content”。

=> 1 // 或者更多..

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

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

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

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

【讨论】:

  • 谢谢,我明天去看看
猜你喜欢
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
相关资源
最近更新 更多