Laravel 4和Eloquent:获取所有记录和所有相关记录

8 浏览
0 Comments

Laravel 4和Eloquent:获取所有记录和所有相关记录

我有两个类:ArtistInstrument。每个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个问题:

  1. 在我的视图中,我可以输出$artist如下:

    {{ $artist->firstname }}
    

    并且我可以遍历$instruments如下:

    @foreach ($instruments as $instrument)
        

    {{ $instrument->name }}

    @endforeach

    但是,我是否可以遍历$artist(我知道只有一个 - 见问题#2),并且对于每个$artist遍历他们的$instruments

  2. 在我的控制器中,我应该如何获取所有的艺术家,并为每个艺术家获取他们关联的乐器,最终目标是在我的视图中按照问题#1的描述对它们进行遍历。
  3. 在上述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)。

0
0 Comments

问题的原因是用户想要检索所有记录和所有相关记录,但是他们尝试使用`select()`方法来指定要检索的列,但是没有成功。他们在控制器中使用了`with()`方法来检索相关记录,并在视图中循环遍历结果以显示相关记录。

解决方法是将要检索的列名称作为参数传递给`with()`方法。例如,如果要检索`Artist`模型的`name`和`age`列以及相关`instruments`模型的所有列,可以这样写:

$artists = Artist::with(['instruments' => function ($query) {
    $query->select('instruments.*');
}])
->select('artists.name', 'artists.age')
->get();

在视图中,可以像之前一样循环遍历结果,显示相关记录的列。

关于如何指定要检索的列的问题,用户被建议将其作为一个单独的问题提出,并提供更具体的细节。他们已经在Stack Overflow上提出了这个问题的链接。

0