2014-12-09 6 views
0

У меня есть эта очень основная проблема. У меня есть 3 модели: Автор - Книга - выдержкаlaravel через отношение - я потерял

В Автор У меня есть это соотношение:

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 

Как я могу напечатать имя книги?

В модели книги колонка с названием просто «название»

Важны: Там будет несколько отрывков из одной книги и в случае многих авторов - много книг. Я думаю, мне нужно отношение HasOneThrough.

ответ

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, но вы можете вытащить записи для книг и выдержек в одно и то же время, чтобы уменьшить количество звонков в БД:

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

не так просто. В каждой книге будет несколько выдержек, а не одна. И выдержки могут быть получены из разных книг, многие за раз. – Peter

+0

не работает. Может быть, мне нужен отдых. Я подойду к этому с новым умом позже. Thx – Peter

+0

@PiotrPlebaniak просто построил здесь простое тестовое приложение, и эта структура работает для меня .. дайте мне знать, какую ошибку вы получаете, и я постараюсь вам помочь ... Возможно, это предположение, вы сделали о вашей структуре БД неправильно. – msturdy

Смежные вопросы