Laravel 4和Eloquent:获取所有记录和所有相关记录
Laravel 4和Eloquent:获取所有记录和所有相关记录
我有两个类: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)
{{ $instrument->name }}
@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()
未定义。
我认为我的模型关系中有一些问题。我还尝试在Artist.php中使用hasMany
定义我的关系(我认为说"每个艺术家有多个乐器"更合理),但是这给我带来了一个错误,因为它期望一个名为artists_instruments
的表,并且它还试图检索该表中不存在的列(如name
)。
问题的原因是用户想要检索所有记录和所有相关记录,但是他们尝试使用`select()`方法来指定要检索的列,但是没有成功。他们在控制器中使用了`with()`方法来检索相关记录,并在视图中循环遍历结果以显示相关记录。
解决方法是将要检索的列名称作为参数传递给`with()`方法。例如,如果要检索`Artist`模型的`name`和`age`列以及相关`instruments`模型的所有列,可以这样写:
$artists = Artist::with(['instruments' => function ($query) { $query->select('instruments.*'); }]) ->select('artists.name', 'artists.age') ->get();
在视图中,可以像之前一样循环遍历结果,显示相关记录的列。
关于如何指定要检索的列的问题,用户被建议将其作为一个单独的问题提出,并提供更具体的细节。他们已经在Stack Overflow上提出了这个问题的链接。