laravel雄辩的麻烦匹配多字表名

时间:2017-01-08 22:49:23

标签: laravel eloquent

当它工作时,我非常喜欢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();
}

使用我用于人们关联的其他记录的相同模式,在人的视图中我正在检查是否有任何要显示的音频文件:

@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

然而,对于那些我有音频文件记录的人来说,这似乎是空的。

关于我可能做错什么或我应该检查的其他地方的任何建议?在此先感谢您的帮助!

2 个答案:

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

所以它将采用自定义表名称而不是使用模型名称的复数版本