2013-04-20 68 views
3

我試圖讓我的用戶(作者實際上最多有5-6位作者)以及他們的最後一篇文章顯示在主頁的側邊欄中。由於他們將在主頁上列出我試圖減少由於性能問題的SQL查詢量。我努力了;如何檢索所有用戶的最後一篇文章

$users=User::with(array('posts'=>function($query){ 

     $query->take(1); 
    }))->get(); 

但是它總共只有一個帖子,而不是每個用戶都有一個帖子。而我的sql知識是有限的。

如何使用Eloquent ORM,查詢生成器或原始sql查詢解決我的問題?

+0

看來我應該首先獲取用戶,然後遍歷它們以獲取他們的最後發佈。所以「sql查詢數量= 1 +用戶數量」。看起來很醜陋:/ – Hasan 2013-04-20 15:04:12

+0

你可以使用SQL進行查詢嗎?如果不是,則應將其作爲標籤移除。 – 2013-04-20 15:27:08

+0

我可以。這就是我說的原因。這裏的問題:http://stackoverflow.com/questions/10277115/select-newest-record-group-by-username-in-sql-server-2008似乎接近我的。我正在調查 – Hasan 2013-04-20 15:31:46

回答

4

解決方案是在User模型排序created_at列上定義hasOne關係。

public function lastPost() 
{ 
    return $this->hasOne('Post')->orderBy('created_at', 'desc'); 
} 

然後您的查詢將是這樣的。

$users = User::with('lastPost')->get(); 

要限制可以約束查詢無論是在關係級別列:

return $this->hasOne('Post')->select('id', 'user_id', 'title', 'created_at')->orderBy('created_at', 'desc'); 

或者當你使用with方法:

$users = User::with(['lastPost' => function($query) 
{ 
    $query->select('id', 'user_id', 'title', 'created_at'); 
})->get(); 

請注意,您所需要的user_idcreated_at列也是如此,因爲它們是0123查詢中的和ORDER BY子句。

+0

thx。這工作很好,看起來很漂亮。但我只需要帖子的標題和ID列。我對構建複雜查詢非常困惑。你能告訴我如何只得到指定的列嗎? – Hasan 2013-04-20 16:08:54

+0

當然,我剛剛更新了附加信息的答案。 – 2013-04-20 16:24:10

+0

再次非常感謝。但結果並不完全是對象。我正在使用$ user-> lastPost ['attributes'] ['title']來達到結果嗎?我認爲我可以達到它使用$ user-> lastPost->標題 – Hasan 2013-04-20 16:56:39

0

一般的SQL的方式來做到這一點是:

select p.* 
from posts p join 
    (select p.authorid, max(created_at) as maxdate 
     from posts p 
     group by p.authorid 
    ) psum 
    on p.authorid = psum.authorid and p.created_at = psum.maxdate 

這個假設有沒有重複。

根據您使用的數據庫,確實有其他方法來編寫此查詢。該版本是標準的SQL。

相關問題