2016-10-12 4 views
2

У меня есть 3 модели: Article, Comment, Reaction.Laravel "inested" with()

Каждая статья имеет много комментариев, и каждый комментарий имеет много реакции:

App \ Статьи:

class Article extends Model 
{ 
    public function comments() { 
     return $this->hasMany('App\Comment'); 
    } 
} 

App \ Комментарий:

class Comment extends Model 
{ 
    public function article() { 
     return $this->belongsTo('App\Article'); 
    } 

    public function reactions() { 
     return $this->hasMany('App\Reactions'); 
    } 
} 

App \ Реакция:

class Reaction extends Model 
{ 
    public function comment() { 
     return $this->belongsTo('App\Comment'); 
    } 
} 

В моей [email protected] Я хочу получать комментарии и их реакции:

ArticleController:

public function index() 
{ 
    $articles = Article::with('comments') 
       ->select('articles.*') 
       ->leftjoin('comments', 'comments.article_id', '=', 'articles.id') 
       ->get(); 

    return view('wiki')->withArticles($articles); 
} 

Я могу перебрать комментарии ($article->comments), однако я не уверен, как сделать комментарий with('reactions')? т.е.

@foreach($article->comments as $comment) 
    @foreach($comment->reactions) 
     // something like this... 
    @endforeach 
@endforeach 
+0

Является ли это действительно необходимо использовать 'with' метод? Вы можете так же легко получить все статьи, используя 'Articles :: all();' –

+0

@Adherence - не знал, что он автоматически соединяется с методом 'all()', спасибо! – frosty

ответ

1

вы можете сделать Nested Eager Loading

$article = Article::with('comments.reactions') 
       ->leftjoin('comments', 'comments.article_id', '=', 'articles.id') 
       ->select('articles.*') 
       ->get(); 
+0

Как насчет реакций? – frosty

+0

@frosty проверить сейчас, добавленные статьи по ошибке – StateLess

+0

Кажется работать, спасибо – frosty

0

Вы можете также сделать этот путь

ArticleController:

public function index() 
    { 
     $articles = Article::with('comments') 
        ->select('articles.*') 
        ->get(); 

     return view('wiki')->withArticles($articles); 
    } 

App \ Статьи:

class Article extends Model 
{ 
    public function comments() { 
     return $this->hasMany('App\Comment')->with('reactions'); 
    } 
} 

App \ Комментарий:

class Comment extends Model 
{ 
    public function article() { 
     return $this->belongsTo('App\Article'); 
    } 

    public function reactions() { 
     return $this->hasMany('App\Reactions'); 
    } 
}