2013-04-20 70 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。

相关问题