我有2个模特,JadwalTerapisKlinik和PesertaKlinik。
我尝试使用此代码调用数据:
$data = JadwalTerapisKlinik::whereHas('pesertaKlinik', function($q){
$q->whereHas('timeControlling', function($qq){
$qq->where('status', 'done');
});
})->with(['pesertaKlinik' => function($q){
$q->with(['timeControlling' => function($qq){
$qq->where('status', 'done');
}]);
}])->orderBy('tanggal', 'desc')->get();
$data = $data->pesertaKlinik()->paginate(10);
但结果是“方法pesertaKlinik不存在。”
这是方法pesertaKlinik在JadwalTerapisKlinik模型中:
public function pesertaKlinik(){
return $this->hasMany(PesertaKlinik::class, 'jadwal_terapis_id');
}
但是当我在find(1)
的第一个查询中使用get()
时,它的工作正常。
结构模型:JadwalTerapis有很多PesertaKlinik,PesertaKlinik有一个TimeControlling。
我的代码有什么问题?提前谢谢你。
答案 0 :(得分:1)
您应该只使用get() => to execute your query
或paginate() => to execute the query and paginate the results
。不是两个都是链接的。
您始终可以使用命令toSql()
代替get()
来检查您的查询是否按照应有的方式编写。
答案 1 :(得分:0)
构建器上的get
调用返回的是模型集合,而不是单个模型实例。集合没有pesertaKlinik
方法。
也许您正在构建器上查找first
方法以返回单个模型实例或null而不是get
方法。
答案 2 :(得分:0)
您无法在已通过paginate()
检索的集合上调用get()
函数。 Meanwile,我认为您可以通过嵌套与JadwalTerapisKlinik
的关系,以简洁的方式查询您的.
模型,如下所示:
$data = JadwalTerapisKlinik::whereHas('pesertaKlinik.timeControlling', function($q){
$q->where('status', 'done');
})->orderBy('tanggal', 'desc')->paginate(10); // instead of get(), call your paginate() method here
现在类似地,您的 渴望加载的关系 与上述查询类似如下:
$data = JadwalTerapisKlinik::whereHas('pesertaKlinik.timeControlling', function($q){
$q->where('status', 'done');
})->with(['pesertaKlinik.timeControlling' => function($q){
$q->where('status', 'done');
}])->orderBy('tanggal', 'desc')->paginate(10);
$data
变量现在包含JadwalTerapisKlinik
个模型的集合,其中whereHas
具有指定的约束,以及与with
的热切加载关系。
因此,为了能够遍历集合及其数据,您肯定需要一个循环(在您的控制器代码中,或在您的视图中):
foreach($data as $singleInstance){
$prestaKliniks = $singleInstance->prestaKlinik; // same as $singleInstance->prestaKlinic()->get();
$timeControlling = $singleInstance->prestaKlinik->timeControlling;
}