多对多关系 Laravel Eloquent。获取具有特定相关 ID 的相关 table

Many-to-many relation Laravel Eloquent. Fetch related table with specific related id

我正在使用 Eloquent 在 Laravel 8 中编写查询。主题和流之间存在多对多关系,它们的支点 table 是课程。

科目: ID 名字

流 ID 名字

课程 ID subject_id stream_id

我必须获取具有特定流的主题。

我写了下面的查询。

$this->subjects = Subject::has('streams',$this->stream)->get();

我遇到了问题。

课程 table :

id stream_id subject_id
1 1 1
2 1 2
3 1 3
4 1 4
5 2 1
6 2 2
7 3 1

这是示例数据。如果我想获取流 ID 为 1 的主题,那么它只会获取 ID 为 3 和 4 的主题,而不获取 ID 为 1 和 2 的主题。谁能解释一下为什么它会跳过 ID 为 1 和 2 的主题?

请任何人帮助我解决这个问题。 先感谢您 。 :)

已编辑

class Subject
{
   public function streams()
    {
        return $this->belongsToMany(Stream::class, 'courses', 
'subject_id', 'stream_id');
    }
}


class Stream
{
   public function subjects()
    {
        return $this->belongsToMany(Subject::class, 'courses', 
'stream_id', 'subject_id');
    }
}

要获取具有特定相关模型的模型,您可以使用 whereHas() 方法。 https://laravel.com/docs/8.x/eloquent-relationships#querying-relationship-existence

假设$this->stream是一个Stream模型,你可以对whereHas方法使用闭包:

$stream = $this->stream;

$this->subjects = Subject::whereHas('streams', function($query) use ($stream){
   $query->where('streams.id', $stream->id);
})->get();

编辑:因为 $this->stream 是一个 id 你应该做

$stream = $this->stream;

$this->subjects = Subject::whereHas('streams', function($query) use ($stream){
   $query->where('streams.id', $stream);
})->get();

您应该在引用 ID 时指定 table 名称以避免歧义。

$this->subjects = Subject::whereHas('streams', function($query) use ($stream){
    $query->where('stream.id', $stream->id);
})->get();