2016-05-14 13 views
0

laravelの熱心なロードでは、私は多くのクエリを実行することなく、その投稿やフォーラムなどのスレッドを取得するにはLaravel - イーガーロード非関係法(N + 1問題)

$forums = Forum::with('posts', 'threads')->get();

ような何かを行うことができます。

しかし、フォーラムの最後の投稿を取得する方法があります。あなたが見ることができるように、私は$subforum->lastThread()多くのことをやっている場合は、

@if ($subforum->lastThread()) 

    <a href="{{ viewThread($subforum->lastThread()) }}"> 
     {{ $subforum->lastThread()->title }} 
    </a> 
    <br> 
    <a href="{{ viewPost($subforum->lastThread()->lastPost) }}"> {{ trans('forum/post.last_post') }} 
     :</a> 
    <a href="{{ viewProfile($subforum->lastThread()->lastPost->user) }}"> {{ $subforum->lastThread()->lastPost->user->info() }}</a> 
    <br> 
    {{ $subforum->lastThread()->lastPost->created_at }} 

@endif 

これは、これが最後のスレッドを得るために、私の部分図であるForum.php

public function lastThread() 
{ 
    $forums = $this->arrayOfIDs(); // get array of all ids, even subforum's subforums. 
    return Thread::whereIn('forum_id', $forums)->orderBy('updated_at', 'desc')->first(); 
} 

の私の方法です。私は$lastThread = $subforum->lastThread()のような変数にそれを格納してから、クエリの数を減らすために$lastThread->created_atのようなことをしますが、私はすべてのフォーラムを取得するために元のクエリを含めるだけであれば、ずっと簡単だと思いました。

何かのように:$forums = Forum::with('posts', 'threads', 'lastThread')->get();おそらく?私はこのメソッドのhasOneリレーションを実行しようとしましたが、最後のスレッドが必ずしもその特定のサブフォーラムに属していないため動作しません。

とにかく、このN + 1の問題を解決するにはどうすればよいですか?

ありがとうございます。

+0

最後のスレッドがすでにあなたの$に含まれていることですフォーラムのコレクション(もちろん関係として)? – Shaz

答えて

0

Cacheクラスは、私はこのパスで行くよりも、あなたのために右である場合は、

、無限の選択肢を持っている、あなたもこれを行うことができます。

protectd $lastThread; 

public function lastThread() 
{ 
    if ($this->lastThread) return $this->lastThread; 
    return $this->fetchLastThread(); 
} 

    public function fetchLastThread() { 
     $forums = $this->arrayOfIDs(); // get array of all ids, even subforum's subforums. 
     $this->lastThread = Thread::whereIn('forum_id', $forums)->orderBy('updated_at', 'desc')->first(); 
     return $this->lastThread; 
}