Laravel 加入到雄辩的分手关系中?

Laravel 加入到雄辩的分手关系中?,laravel,eloquent,laravel-query-builder,Laravel,Eloquent,Laravel Query Builder,我有以下关系: 我在课程和用户之间有一个多对多的关系,然后在用户和证书之间又有一个多对多的关系 现在,以下是如何从一门课程中获取所有在同一门课程中拥有证书的用户的方法: $user = $course->users() ->whereHas('certificates', function ($query) use($course){ $query->where('course_certificates.course_id', '=', $course-&

我有以下关系:

我在课程和用户之间有一个多对多的关系,然后在用户和证书之间又有一个多对多的关系

现在,以下是如何从一门课程中获取所有在同一门课程中拥有证书的用户的方法:

$user = $course->users()
  ->whereHas('certificates', function ($query) use($course){
         $query->where('course_certificates.course_id', '=', $course->id);
})->first();
这将返回具有证书$user->certificates的用户。 这就是问题所在

挑选* 来自课程用户 其中course\u users.course\u id=?和 课程\用户。课程\ id不为NULL,并且 存在 挑选* 从课程证书 其中course\u users.id=course\u certificates.user\u id和 课程证书。课程id=? 如果改用联接:

然后我得到了相同的用户,但是$user->certificates的关系是空的

挑选* 来自课程用户 内部连接课程证书 课程证书上的用户id=课程用户id 其中course\u users.course\u id=?和 课程\用户。课程\ id不为NULL,并且 课程证书。课程id=?
这是为什么?

我不是100%确定,但是如果你使用join,我想拉威尔不明白你用什么表连接它,它是一个关系,它只是一个连接,它可能意味着什么,但是第一个查询你告诉它关系的意思,其中有一些X关系的数据

查看源代码,我可以确认我所说的:和


魔法会将数据添加到您的关系中吗。请注意,join并没有做任何这方面的事情,它实际上是连接查询,没有其他与关系相关的事情。join也来自Query/Builder,其他任何关于关系的方法都来自Eloquent/Builder。

我不认为这会有什么不同,但是如果您通过->和“certificates”在这两个查询上加载证书,它会改变什么吗?乍一看,我不明白为什么第二种方法在$user->certificates中没有任何内容……我猜第二种方法将在关联数组中组合这两个表数据。但laravel关系在单独的键状证书中返回连接的表数据。第二种方法类似于在mysql中执行查询。我希望with或WHERHAS基于表字段进行内部映射,并生成用户友好的结果。在第一种情况下,当您不使用join时,它是一个有说服力的模型。但是当你使用join时,它会变成查询生成器,$user->certificates不起作用。@Timleis我也会尝试从头开始创建这个示例,也许它与我的版本有关,我在Laravel 5.6上不清楚,你写了两个多名字来命名与用户的关系,但在课程和证书之间还有一个透视表。你能在github上分享你的测试代码来准确地再现你所做的吗。
$user = $course->users()
    ->join('course_certificates', 'course_certificates.user_id', '=', 'course_users.id')
    ->where('course_certificates.course_id', '=', $course->id)
    ->first();