我有两个课程:Artist
和Instrument
。每个Artist
可以播放一个或多个Instrument
。每个Instrument
都可以分配给一个或多个Artist
。所以,我已经设置了以下类:
Artist.php
public function instruments() {
return $this->belongsToMany('App\Models\Instrument');
}
Instrument.php
public function artists() {
return $this->belongsToMany('\App\Models\Artist');
}
然后我有三个数据库表:
artists: id, firstname, lastname, (timestamps)
instruments: id, name
artist_instrument: id, artist_id, instrument_id
我能够成功检索一个艺术家及其相关乐器,如下所示:
ArtistController.php
$artist = Artist::find($artist_id);
$instruments = $artist->instruments()->get();
return \View::make('artists')->with('artists', $artists)->with('instruments', $instruments);
我有3个问题:
在我看来,我可以输出$artist
,如:
{{ $artist->firstname }}
我可以遍历$instruments
,如:
@foreach ($instruments as $instrument)
<h2>{{ $instrument->name }}</h2>
@endforeach
但是可以迭代$artist
(我知道只有一个 - 请参阅#2)和每个$artist
迭代$instruments
吗?
在我的控制器中,我如何获得所有艺术家以及每个相关乐器的最终目标,在#1中描述的视图中迭代它们。
是否可以仅检索上述ArtistController.php
示例中的特定列?我试过这个:
$artist = Artist::where('id', $artist_id)->get('firstname');
$instruments = $artist->instruments()->get();
return \View::make('artists')->with('artists', $artists)->with('instruments', $instruments);
但我收到一条错误消息,指出Collection::instruments()
未定义。
我假设我的模特关系中有些不对劲。我也尝试用hasMany
在 Artist.php 中定义我的关系(我认为说“每个艺术家都有很多乐器”更有意义,但这给了我一个错误,因为它是期待一个名为artists_instruments
的表,并且它还试图检索该表中不存在的列(如name
)。
答案 0 :(得分:8)
你的模特关系很好。
<强>控制器:强>
$artists = Artist::with('instruments')->get();
return \View::make('artists')->withArtists($artists);
查看:强>
@foreach ($artists as $artist)
<h1>{{ $artist->firstname }}</h1>
@foreach ($artist->instruments as $instrument)
<h2>{{ $instrument->name }}</h2>
@endforeach
@endforeach