Laravel:多个table的关联使用枢轴

Laravel: Associations of multiple table using pivot

这是我的表格

id
board_name

classes

id
class_name

科目

id
subject_name

board_classes

id
board_id
class_id

board_class_subjects

id
board_id
class_id
subject_id

我在我的模型中写了以下关联

Board.php

public function classes()
{
 return $this->belongsToMany('Clas','board_classes','board_id','class_id');
}

Clas.php

public function subjects()
{
    return $this->belongsToMany('Subject','board_class_subjects','class_id', 'subject_id');
}

不确定在从上述关联中提取记录时我会在哪里提供 class_id 的条件。我试过了:

$response = Board::with('classes.subjects')->where('id', 1)->get();

我正在获取板 id 1 的所有 classes 的主题,但我想获得 class id 1 和板 id 1 的所有主题。

您必须使用whereHas按相关模型过滤结果:

$response = Board::with('classes.subjects')
                 ->where('id', 1)
                 ->whereHas('classes', function($q){
                     $q->where('id', 1);
                 })
                 ->get();

这将过滤掉没有 class 且 ID 为 1 但仍急切加载剩余板的所有 class 的板。要更改它,请将相同的过滤器添加到 with:

$response = Board::with(['classes' => function($q){
                     $q->where('id', 1);
                 }, 'classes.subjects'])
                 ->whereHas('classes', function($q){
                     $q->where('id', 1);
                 })
                 ->find(1);