3

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

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

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

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

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

4

2 回答 2

4

一种解决方案是通过帖子列定义模型排序的hasOne关系。Usercreated_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_idcreated_at列,因为它们是查询中的WHEREandORDER BY子句所必需的。

于 2013-04-20T15:31:43.550 回答
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。

于 2013-04-20T15:34:59.777 回答