Laravel 4和Eloquent:检索所有记录和所有相关记录

时间:2014-02-12 17:21:29

标签: orm laravel foreign-key-relationship 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)
        <h2>{{ $instrument->name }}</h2>
    @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()未定义。

  4. 我假设我的模特关系中有些不对劲。我也尝试用hasMany Artist.php 中定义我的关系(我认为说“每个艺术家都有很多乐器”更有意义,但这给了我一个错误,因为它是期待一个名为artists_instruments的表,并且它还试图检索该表中不存在的列(如name)。

1 个答案:

答案 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