我有这个非常基本的问题。 我有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关系。
答案 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);