当 Eloquent 工作时,我非常喜欢它!但是这次我添加了一个带有两个单词名称的表,并且出现了一些我还没有看到的错误...
我已经有一个 Person 对象/人员表,其他实体已经具有一对多关系。现在我添加了可以多人播放的音频文件的概念。我为此添加了两个表:
- audio_files(带有自动 ID、文件名、摘要、时间戳)
- audio_file_person(带有自动 ID、audio_file_id 和 person_id)
然后我有 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();
}
使用与人们关联的其他记录相同的模式,在该人的 View 中,我检查是否有任何音频文件要显示:
@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
但是,对于我确实有audio_file_person 记录的人来说,这似乎是空的。
关于我可能做错了什么或者我应该检查哪里有什么建议吗?预先感谢您的帮助!
最佳答案
尝试在belongsToMany关系中指示数据透视表。
在您的 Person 模型中:
public function audio_files()
{
return $this->belongsToMany(AudioFile::class, 'audio_file_person', 'person_id', 'audio_file_id');
}
在您的音频文件模型中:
public function people()
{
return $this->belongsToMany(Person::class, 'audio_file_person', 'audio_file_id', 'person_id');
}
对于audio_file_person 表,我通常不会在数据透视表上包含递增的id,但这实际上不会造成问题。
更新1:
在 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
更新2:
在您的项目根目录中:
> php工匠修补匠
> 使用 App\Person
(或 Person
模型的命名空间)
> $person = Person::find(1)
(您在数据透视表中设置的 ID)
> $person->audio_files
关于laravel eloquent 匹配多字表名时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41538740/