如何使用上一篇文章检索所有用户

时间:2013-04-20 14:40:56

标签: sql laravel laravel-4

我正在努力让我的用户(作者实际上,最多会有5-6位作者)将他们的最后一篇文章显示在主页的侧边栏中。由于它们将在主页中列出,我试图减少由于性能问题导致的sql查询量。我试过了;

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

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

然而,它总共只有一个帖子,而不是每个用户都有一个帖子。我的sql知识有限。

如何使用Eloquent ORM,查询生成器或原始SQL查询来解决我的问题?

2 个答案:

答案 0 :(得分:4)

解决方案是根据帖子hasOne列对User模型排序定义created_at关系。

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_id created_at 列,因为WHEREORDER BY条款需要这些列在查询中。

答案 1 :(得分: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。