laravel通过关系 - 我迷路了

时间:2014-12-09 13:20:49

标签: laravel relationships

我有这个非常基本的问题。 我有3个型号: 作者 - 书 - 摘录

作者中我有这样的关系:

public function autoredExcerpts()
{
    return $this->hasMany('App\Excerpt', 'author_id');
}

在我的视图中,我想显示作者信息并列出他书中的所有摘录。我有这个

@foreach ($author->autoredExcerpts as $xc)
<div class="box_excerpt">
{{$xc->content}}  //prints the excerpt
<span class="source">{{ $xc->book_id}}</span>  // now it prints the book's id only
</div>
@endforeach

如何打印图书的名称?

在Book模型中,名称的列只是'title'

重要:一本书中会有多个摘录,如果有很多作者,那么会有很多书。 我想我需要HasOneThrough关系。

1 个答案:

答案 0 :(得分:1)

您可以使用hasManyThrough将作者与其摘录相关联,并使用belongsTo将摘录与其图书联系起来:

作者和他的书之间的

Has-many-through relationship

class Author extends Eloquent {

    public function excerpts()
    {
        return $this->hasManyThrough('Excerpt', 'Book');
    }

告诉摘录who he belongs to(假设每个摘录只能属于一本书):

class Excerpt extends Eloquent {

    public function book()
    {
        return $this->belongsTo('Book');
    }

现在在你看来:

@foreach ($author->excerpts as $excerpt)
  <div class="box_excerpt">

    {{ $excerpt->content }}  //prints the excerpt (assuming it's stored in 'content')
    <span class="source">{{ $excerpt->book->title }}</span>  // the book's name

  </div>
@endforeach

最后一点:Eager Loading也可以让您的数据库变得简单..我不知道您在哪里定义$author,但您可以提取记录书籍和摘录同时减少对DB的调用:

$author = Author::with('excerpts.book')->find($author_id);