【问题标题】:How to treat 'No query results for model' in Laravel如何在 Laravel 中处理“模型没有查询结果”
【发布时间】:2018-03-06 14:24:54
【问题描述】:

我们有一个拥有 100 个用户的数据库……例如

这是路线

Route::get('/users/{user}/edit', 'UserController@edit');

方法如下

public function edit(User $user)
{
    $hi = 'Hello';
    return $hi;
}

好吧..如果我做这样的事情

http://localhost/users/99/edit | WORKS
http://localhost/users/100/edit | WORKS
http://localhost/users/101/edit | PROBLEM

当用户从不存在记录的URL更改值时如何解决..?

【问题讨论】:

  • 这是因为 id 为 101 的用户不存在,您可以通过 id 并在 try 块和异常重定向中使用 find 方法
  • 重定向到 404 页面
  • 这就是laravel的正确行为,你只需要创建Handler来渲染一个404页面。
  • @ka_lin 我知道不存在..只是想要一个方法...因为如果我在没有“用户”模型的情况下使用 $user...一切都可以..我必须做的是做一些检查..但我想保留模型的版本
  • @DeepanshSachdeva 我该怎么做?

标签: php laravel routes


【解决方案1】:

有点晚了,但这是一个有用的问题。

要抑制错误消息,您可以将 (dot)ENV 文件中的调试模式设置为 false APP_DEBUG=true。由于路由模型绑定,上面的其他解决方案对您没有帮助,因为如果找不到模型,您将无法进入控制器。除非您没有得到模型,而只有 id 或 slug 等,然后在函数内对数据库进行查询。

【讨论】:

    【解决方案2】:

    在您的情况下,找不到用户,即 404:

    public function edit(User $user)
    {
        $user = false; // dummy/example
        if ($user) {
            return $your_results;
        } else {
            return view('errors.404');
            // assuming you have a folder called 'errors' inside your 'views' folder
            // and the file name is `404.blade.php`
            // and are using blade files.
        }        
    }
    

    如果可以找到用户,则显示您需要的任何内容,否则,显示 404 刀片视图。

    【讨论】:

      【解决方案3】:

      在这种情况下,我会将用户 ID 作为参数而不是显式绑定传递:

      Route::get('/users/{userId}/edit', 'UserController@edit');

      找不到模型时会抛出ModelNotFoundException异常,你可以捕获它并处理这种情况

      控制器:

      use Illuminate/Database/Eloquent/ModelNotFoundException;
      
      [...]
      
      public function edit($userId)
          {
              try{
                  $user = User::find($userId);
                  //do some stuff
              } catch (ModelNotFoundException $e){
                  //treat error (log the activity, redirect to a certain page)
                  //or display a 404 page
                  //dealer's choice
              }
          }
      

      【讨论】:

      • Laravel 隐含地在做同样的事情……你最终会抛出已经被抛出的异常,而 OP 想要实际处理它。
      • @DeepanshSachdeva Laravel 确实返回了 404 的 http 状态码(带有 html),我还指出 OP 可以做其他各种事情,你不同意吗?
      • 我同意...您的回答是一个可行的解决方案,但使用单个处理程序来呈现 404 页面会使其更通用。
      • 这只是一个例子,可能我没有说清楚
      • 感谢您的回复..但我想使用模型名称.. 编辑(用户 $user)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 2018-02-11
      • 2019-12-04
      相关资源
      最近更新 更多