I love Eloquent so much when it's working! But this time I'm adding a table with a two-word name, and I have something wrong that I just don't see yet...
I already have a Person object/people table, with other entities having a one-to-many relationship working already. Now I'm adding the concept of audio files that can feature multiple people. I've added two tables for this:
Then I have AudioFile.php:
class AudioFile extends Model
{
    protected $fillable = [
        'filename', 'summary', 'recording_date'
    ];
    public function people()
    {
        return $this->belongsToMany('App\Person'); 
    }
    public function getPersonListAttribute()
    {
        return $this->people->lists('id')->all();
    }
}
And I've updated Person.php with this:
public function audio_files()
{
    return $this->belongsToMany('App\AudioFile')->withTimestamps();
}
public function getAudioFileListAttribute()
{
    return $this->audio_files->lists('id')->all();
}
Using the same pattern I've used for other records that people are associated with, in the person's view I'm checking to see if there are any audio files to show:
@unless ($subject->audio_files->isEmpty())
    <div>
        <h4>Audio links: </h4>
        @foreach($subject->audio_files as $audio)
            @include ('audio.partials.audio_link', ['audio' => $audio])
        @endforeach
        <br/>
    </div>
@endunless
However, this seems to be empty for people where I do have audio_file_person records for them.
Any suggestions on what I might be doing wrong or where else I should be checking? Thanks in advance for your help!
Try indicating the pivot table in the belongsToMany relationship.
In your Person model:
public function audio_files()
{
    return $this->belongsToMany(AudioFile::class, 'audio_file_person', 'person_id', 'audio_file_id');
}
In your AudioFile model:
public function people()
{
    return $this->belongsToMany(Person::class, 'audio_file_person', 'audio_file_id', 'person_id');
}
For the audio_file_person table, I usually don't include an incremented id on a pivot table, but it shouldn't really pose a problem.
Update 1:
In the view:
@foreach($people as $person)
    {{$person->name}}: <br>
    @unless ($person->audio_files->isEmpty())
      <ul>
      @foreach($person->audio_files as $audio_file)
        <li>{{$audio_file->filename}}</li>
      @endforeach
    </ul>
    @endunless
@endforeach
Update 2:
In your project root:
> php artisan tinker> use App\Person (or namespace of your Person model)> $person = Person::find(1) (an id that you've set up in the pivot table)> $person->audio_files
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With