Laravel 5.8 控制器调用模型全量查询方法返回空如何解决
问题解答
核心原因
- 你在控制器中调用模型的
allCircuits方法后,没有接收该方法的返回值,反而直接输出了刚实例化的空模型对象,自然得到空结果。 - 模型层职责越界:模型不应该直接构造
response()->json()响应对象,响应的构造属于控制器层的职责。 - 命名不规范隐患:你定义的模型类名为小写
circuits,但方法内部调用时用了大写开头的Circuits::all(),在区分大小写的系统环境下会触发类未找到错误。
修正方案
最优修正(符合MVC分层规范)
1. 模型代码调整
<?php namespace App; use Illuminate\Database\Eloquent\Model; // 遵循Laravel规范:模型类使用大驼峰单数命名,对应表名默认是小写复数 class Circuit extends Model { // 若表名不符合默认规则可手动指定,避免自动匹配出错 protected $table = 'circuits'; protected $fillable = [ 'circuitId', 'circuitRef', 'name', 'location', 'country', 'lat', 'lng', 'alt', 'url', ]; public function races() { return $this->hasMany('App\Race', 'circuitId'); } // 模型仅返回数据集,不处理响应构造 public function allCircuits(){ return self::all(); } }
2. 控制器代码调整
public function index() { $circuitModel = new \App\Circuit(); // 接收模型方法返回的数据 $data = $circuitModel->allCircuits(); // 控制器层构造JSON响应返回 return response()->json($data); }
你也可以直接用静态调用简化代码,不需要实例化模型:
public function index() { return response()->json(\App\Circuit::all()); }
临时快速修复(不调整模型逻辑)
如果你暂时不想修改现有模型的代码,只需要修改控制器,接收方法返回值即可正常输出:
public function index() { $data = new \App\circuits(); // 直接返回模型方法的返回值即可,不要输出空模型实例 return $data->allCircuits(); }
内容的提问来源于stack exchange,提问作者GkChris99
相关产品推荐
相关产品推荐

