Php 拉雷维尔:我如何定义这种关系?

Php 拉雷维尔:我如何定义这种关系?,php,laravel,eloquent,Php,Laravel,Eloquent,我有以下表格: lessons - lessonID - lessonName .. sections - sectionID - lessonID references lessons.lessonID .. exercises - exerciseID - sectionID references sections.sectionID .. 我建立了以下关系: 教训: public function sections() { return $this->hasMany('

我有以下表格:

lessons
- lessonID
- lessonName
..

sections
- sectionID
- lessonID references lessons.lessonID
..

exercises
- exerciseID
- sectionID references sections.sectionID
..
我建立了以下关系:

教训:

public function sections()
{
    return $this->hasMany('Section', 'lessonID');
}
第节:

public function lesson() {
    return $this->belongsTo('Lesson', 'lessonID');
}

public function exercise() {
    return $this->hasOne('Exercise', 'sectionID');
}
练习:

public function section() {
    return $this->belongsTo('Section', 'sectionID');
}
现在我想说的是,一节课有很多练习,所以我尝试添加

public function exercises()
{
    return $this->hasManyThrough('Exercise', 'Section', 'lessonID', 'sectionID');
}
到课程模型,我运行

Lesson::with('sections','exercises')

给我一个空数组来做练习。我怎样才能实现我想要的

编辑:我正在对练习表进行播种,如下所示:

<?php

class ExerciseTableSeeder extends Seeder {

public function run()
    {
    DB::table('exercises')->delete();

    Exercise::create(array(
        'exerciseID' => 1,
        'sectionID' => 2,
        ...
        ));

    Exercise::create(array(
        'exerciseID' => 2,
        'sectionID' => 4,
        ...
        ));

    }
}

?>

编辑2:以下是我的模型:

以下是查询日志:

因此,简而言之:课程及其部分返回得很好,但我得到了一个空的练习数组。问题在于:

public function exercise() {
    return $this->hasOne('Exercise', 'Section');
}
应该是:

public function exercise() {
    return $this->hasOne('Exercise', 'sectionID');
}
编辑:

你的hasManyThrough亲戚也错了。事情是这样的:

hasManyThrough('farModel', 'relatedModel', 'keyOnRelatedModel', 'keyOnFarModel')
如此正确:

public function exercises()
{
    return $this->hasManyThrough('Exercise', 'Section', 'lessonID', 'sectionID');
}

编辑:
对于@clod986 note-hasManyThrough()来说,只要一对多->一对一是一(不属于sto)关系,它的作用是一样的。

在@deczo的帮助下,你现在就可以设置它了。很可能您没有任何相关条目,这可能是空数组的原因

编辑

似乎在这种情况下不应该使用
hasManyThrough
函数

如果关系设置正确(如您在对该答案的评论中所确认的),则可以在中找到答案。它明确指出

例如,一个国家/地区模型可能有许多通过a用户发布的帖子 模型

我认为,
hasManyThrough
的关系是一对一+一对多的关系。在你的例子中是一对多+一对一,这可能就是它不起作用的原因



我建议您将此问题报告给。

在我报告了此问题后,我得到了一个令人尴尬的简单回答:请求应该是
Lesson::with('sections.exercises')
取而代之。

您所说的“有效但为空…”是什么意思?确切的输出是什么?它为我提供了课程及其部分的数据,但为练习提供了一个空数组。很抱歉,我编辑了这篇文章。到时候应该可以了,请粘贴你的每一个关系described@deczo:使用关系良好捕获更新问题。不幸的是,我仍然收到一个空数组。已更改,仍然是空数组。您确定您的数据库中有有效数据吗?嗯,所有内容都是使用种子类进行种子设定的,因此应该是正确的。我通过查看PhpMyAdmin验证了这一点,没有发现任何错误。那些模型看起来很好,试着在PhpMyAdmin或普通MySQl中运行它。你说的相关条目是什么意思?所有的表都是使用种子填充的。这就是我所想的,但是可能由于IDs种子,没有与特定课程相关的练习。可能是这种情况吗?我有一节关于lessonID 1的课,有些部分ID为1-10,所有部分都有lessonID 1,最后还有一些练习ID为1和2,但是部分ID为2和4。作为一个愚蠢的检查,如果你不急于加载,只是在
lesson::find]中循环转储练习,你会得到什么吗(1) ->sections
?@pg robban,检查我更新的UN答案。我认为这就是它不起作用的原因;)好的,但这是另一个与hasManyThrough无关的解决方案。那是一个嵌套的,我明白了。。。这对我来说是全新的、令人困惑的。不过我已经关闭了他们Github的门票。