如何在laravel中通过急切加载从3个表中获取数据

我有一个这样的表关系

http://img4.mukewang.com/61727bba0001db1105620376.jpg

Laravel框架关于急切加载特性的这个问题


我的热切加载代码如下:


$schedules = Schedule::whereHas(

    'mahasiswa',

    function($mahasiswa) use ($start, $limit, $order, $dir, $search) {

        $mahasiswa->whereHas(

            'document_thesises',

            function($documentThesis) use ($start, $limit, $order, $dir, $search) {

                $documentThesis->where('npm', 'LIKE', "%$search%")

                    ->orWhere('name', 'LIKE', "%$search%")

                    ->offset($start)

                    ->limit($limit)

                    ->orderBy($order, $dir);

        });

    }

)->get();

对于上表中的模型,代码如下: Mahasiswa 模型:


public function document_thesises()

{

    return $this->hasMany(DocumentThesis::class, 'id', 'document_thesis_id');

}

文献论文模型:


public function mahasiswa()

{

    return $this->belongsTo(Mahasiswa::class);

}

时间表模型:


public function mahasiswa()

{

    return $this->belongsTo(Mahasiswa::class, 'mahasiswa_id', 'id');

}

我希望结果可以根据schedule表格显示表格中的所有数据document_thesis。但是,我得到了这样的错误:


exception: "Illuminate\Database\QueryException"

file: "/mnt/d/www/eta/vendor/laravel/framework/src/Illuminate/Database/Connection.php"

line: 664

message: "SQLSTATE[42S22]: Column not found: 1054 Unknown column 'mahasiswas.document_thesis_id' in 'where clause' (SQL: select * from `schedules` where exists (select * from `mahasiswas` where `schedules`.`mahasiswa_id` = `mahasiswas`.`id` and exists (select * from `document_thesises` where `mahasiswas`.`document_thesis_id` = `document_thesises`.`id` order by `id` asc limit 10 offset 0) and `mahasiswas`.`deleted_at` is null))"

trace: [,…]


慕虎7371278
浏览 150回答 2
2回答

一只斗牛犬

抛出此异常的原因是 的关系Mahasiswa@document_thesises不正确。正如我们所看到的,所需的关系是一对多的。在 Laravel 术语中,HasMany应该使用这种关系。目前您的代码表明它是一个BelongsTo关系,它需要相关模型的本地外键。查询试图加入mahasiswas.document_thesis_id不存在的相关模型。将关系方法更改为hasMany应该可以解决问题。// Mahasiswa modelpublic function document_thesises(){    return $this->hasMany(DocumentThesis::class);}// DocumentThesis modelpublic function mahasiswa(){    return $this->belongsTo(Mahasiswa::class);}

忽然笑

将 Mahasiswa 模型中的 document_thesises 函数更改为public function document_thesises()    {        return $this->hasMany(DocumentThesis::class, 'document_thesis_id','id');    }
打开App,查看更多内容
随时随地看视频慕课网APP