方法未找到laravel模型

时间:2016-01-16 06:38:10

标签: php laravel eloquent

我有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。

我的代码有什么问题?提前谢谢你。

3 个答案:

答案 0 :(得分:1)

您应该只使用get() => to execute your querypaginate() => 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;
}