【问题标题】:laravel through relation - I'm lostlaravel 通过关系 - 我迷路了
【发布时间】:2015-02-07 09:40:20
【问题描述】:

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

【问题讨论】:

    标签: laravel relationships


    【解决方案1】:

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

    Has-many-through relationship 在作者和他的书之间:

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

    Tell the Excerpt who he belongs to(假设每个 Excerpt 只能属于一本书):

    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,但您可以同时提取书籍和摘录的记录时间,减少对数据库的调用:

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

    【讨论】:

    • 没那么容易。每本书都会有多个节选,而不是一个。摘录可以来自不同的书籍,一次很多。
    • 它不起作用。也许我需要休息一下。稍后我会以全新的心态来处理这个问题。谢谢
    • @PiotrPlebaniak 刚刚在这里构建了一个简单的测试应用程序,这个结构对我有用..让我知道你遇到了什么错误,我会尽力帮助你......它可能是我对您的数据库结构所做的假设不正确。
    • 太棒了!很高兴听到它!
    • 我找到了昨天失败的原因。如果我将关系名称从“book”更改为“sourcedBook”,L5 将产生此错误:在 CompilerEngine->handleViewException(object(ErrorException)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多