Laravel 4 and Eloquent: retrieving all records and all related records
Your model relationships are fine.
Controller:
$artists = Artist::with('instruments')->get();
return \View::make('artists')->withArtists($artists);
View:
@foreach ($artists as $artist)
<h1>{{ $artist->firstname }}</h1>
@foreach ($artist->instruments as $instrument)
<h2>{{ $instrument->name }}</h2>
@endforeach
@endforeach
tptcat
Web developer, iOS developer, composer, and musician in Austin, TX.
Updated on June 28, 2022Comments
-
tptcat almost 2 years
I have two classes:
Artist
andInstrument
. EachArtist
can play one or moreInstrument
s. And eachInstrument
can be assigned to one or moreArtist
s. So, I've set up the following Classes:Artist.php
public function instruments() { return $this->belongsToMany('App\Models\Instrument'); }
Instrument.php
public function artists() { return $this->belongsToMany('\App\Models\Artist'); }
Then I have three database tables:artists: id, firstname, lastname, (timestamps) instruments: id, name artist_instrument: id, artist_id, instrument_id
I'm able to successfully retrieve a one artist and their associated instruments like so:ArtistController.php
$artist = Artist::find($artist_id); $instruments = $artist->instruments()->get(); return \View::make('artists')->with('artists', $artists)->with('instruments', $instruments);
I have 3 questions:
In my view, I can output the
$artist
like:{{ $artist->firstname }}
and I can iterate through
$instruments
like:@foreach ($instruments as $instrument) <h2>{{ $instrument->name }}</h2> @endforeach
but is it possible to iterate over
$artist
(I know there's only one — see #2) and for each$artist
iterate over their$instruments
?In my controller, how would I get all artists and for each of those their associated instruments with the end goal of iterating through them in my view as described in #1.
Is it possible to only retrieve specific columns in the above example of
ArtistController.php
? I've tried this:$artist = Artist::where('id', $artist_id)->get('firstname'); $instruments = $artist->instruments()->get(); return \View::make('artists')->with('artists', $artists)->with('instruments', $instruments);
but I get an error saying
Collection::instruments()
is undefined.
I'm assuming there's something not right in my model relationships. I've also tried defining my relationship in Artist.php with a
hasMany
(I think it makes more sense to say "Each Artist hasMany Instruments", but that gives me an error because it's expecting a table namedartists_instruments
and it's also trying to retrieve columns that wouldn't exists in that table (likename
). -
tptcat about 10 yearsI just stumbled upon the answer as you posted and this is exactly what I did. Thank you!
-
tptcat about 10 yearsOne more thing (and I can post this as a separate question if it makes sense) how would I specify the columns to retrieve if I didn't want to retrieve all of them? I've tried using
select()
in various places, but nothing seems to work. -
Joseph Silber about 10 years@tptcat - that should definitely be a separate question.
-
tptcat about 10 yearsThe followup question is here: stackoverflow.com/questions/21737547/…