当它工作时,我非常喜欢Eloquent!但是这次我添加了一个带有双字名称的表格,我有些不对劲,我还没看到......
我已经拥有了一个Person对象/人员表,其他实体已经具有一对多的关系。现在我正在添加可以包含多个人的音频文件的概念。我为此添加了两个表:
然后我有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();
}
}
我用这个更新了Person.php:
public function audio_files()
{
return $this->belongsToMany('App\AudioFile')->withTimestamps();
}
public function getAudioFileListAttribute()
{
return $this->audio_files->lists('id')->all();
}
使用我用于人们关联的其他记录的相同模式,在人的视图中我正在检查是否有任何要显示的音频文件:
@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
然而,对于那些我有音频文件记录的人来说,这似乎是空的。
关于我可能做错什么或我应该检查的其他地方的任何建议?在此先感谢您的帮助!
答案 0 :(得分:1)
尝试在belongsToMany关系中指示数据透视表。
在你的人物模型中:
public function audio_files()
{
return $this->belongsToMany(AudioFile::class, 'audio_file_person', 'person_id', 'audio_file_id');
}
在您的AudioFile模型中:
public function people()
{
return $this->belongsToMany(Person::class, 'audio_file_person', 'audio_file_id', 'person_id');
}
对于audio_file_person表,我通常不会在数据透视表上包含递增的ID,但它不应该造成问题。
更新1:
在视图中:
@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
更新2:
在项目根目录中:
> php artisan tinker
> use App\Person
(或Person
模型的命名空间)
> $person = Person::find(1)
(您在数据透视表中设置的ID)
> $person->audio_files
答案 1 :(得分:0)
如果错误无法按照模型获取表名,则必须在模型中声明table属性
protected $table = 'audio_file_person';
所以它将采用自定义表名称而不是使用模型名称的复数版本