多对多关系 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();
我正在使用 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();