我正在努力让我的用户(作者实际上,最多会有5-6位作者)将他们的最后一篇文章显示在主页的侧边栏中。由于它们将在主页中列出,我试图减少由于性能问题导致的sql查询量。我试过了;
$users=User::with(array('posts'=>function($query){
$query->take(1);
}))->get();
然而,它总共只有一个帖子,而不是每个用户都有一个帖子。我的sql知识有限。
如何使用Eloquent ORM,查询生成器或原始SQL查询来解决我的问题?
答案 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 列,因为WHERE
和ORDER 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。