2016-05-14 19 views
0

隨着laravel的預先加載,我可以這樣做Laravel - 伊格負載的非關係法(N + 1問題)

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

要獲得線程作爲其帖子和論壇沒有做很多查詢。

但是,我有一個方法獲取論壇的最後一篇文章。

這是我在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(); 
} 

法這是我的部分觀點,以獲得最後一個線程:

@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 

正如你可以看到,如果我做$subforum->lastThread()了很多。我可以將其存儲在像$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; 
}