Laravel 5.6搜索时如何获取关联模型数据?
解决Laravel搜索结果无法获取关联模型数据的问题
嘿,这个问题我之前也碰到过,核心原因是你没有在查询时预加载关联模型。Laravel的Eloquent默认采用「延迟加载」策略——只有当你主动访问关联属性时,才会执行额外的SQL查询去获取关联数据,但你的searchScoop方法里只调用了get(),并没有把关联的用户数据一起查询出来,所以返回给前端的JSON里自然看不到这部分内容。
下面是具体的解决办法:
方法一:在查询中使用with()预加载关联
直接在你的searchScoop方法里添加with('getClassTreaner'),告诉Eloquent在查询班级数据的同时,把对应的讲师(关联的User模型)数据一起查出来:
public static function searchScoop($keyword) { $data = Classe::with('getClassTreaner') // 预加载关联的用户模型 ->where('id','like','%'.$keyword.'%') ->orWhere('class_name','like','%'.$keyword.'%') ->limit(30) ->get(); return $data; }
这样返回的每个Classe模型实例都会包含getClassTreaner对应的User数据,前端AJAX拿到的JSON里就能看到这部分内容了。
方法二:全局自动加载关联(可选)
如果你的业务场景中,几乎每次查询Classe模型都需要获取关联的讲师数据,可以在Classe模型里设置$with属性,让Eloquent自动加载这个关联:
class Classe extends Model { // 全局自动加载关联 protected $with = ['getClassTreaner']; public function getClassTreaner() { return $this->hasOne('App\User', 'id', 'class_treaner'); } // ... 其他方法 }
不过这种方式要谨慎使用,如果某些查询不需要关联数据,会造成不必要的性能开销,所以更推荐第一种按需预加载的方式。
小提示:规范关联方法命名
按照Laravel的命名惯例,关联方法通常采用驼峰命名(不带get前缀),比如把getClassTreaner改成classTrainer,这样代码可读性更高,访问关联时也更符合习惯:
public function classTrainer() { return $this->hasOne('App\User', 'id', 'class_treaner'); }
对应的预加载代码也要改成with('classTrainer'),这样看起来更清爽~
内容的提问来源于stack exchange,提问作者Awar Pulldozer
相关产品推荐
相关产品推荐

