【问题标题】:How to retrieve all users with their last post如何检索所有用户的最后一篇文章
【发布时间】:2013-04-13 20:17:57
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 看来我应该先获取用户,然后遍历他们以获取他们最后的帖子。所以“sql 查询数 = 1 + 用户数”。看起来很丑:/
  • 您可以使用 SQL 进行查询吗?如果没有,您应该将其作为标签删除。
  • 我可以。这就是我放它的原因。这里的问题:stackoverflow.com/questions/10277115/… 似乎与我很接近。我正在调查它

标签: sql laravel laravel-4


【解决方案1】:

一种解决方案是在User 模型上定义hasOne 关系,按帖子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_idcreated_at 列,因为查询中的 WHEREORDER BY 子句需要它们。 p>

【讨论】:

  • 谢谢。效果很好,看起来很漂亮。但我只需要帖子的标题和 ID 列。我对构建复杂的查询感到非常困惑。你能告诉我如何只获取指定的列吗?
  • 当然,我刚刚用额外的信息更新了答案。
  • 再次非常感谢。但结果并不完全反对。我正在使用 $user->lastPost['attributes']['title'] 达到结果,可以吗?我以为我可以使用 $user->lastPost->title
  • 一旦你有一个单一的用户对象,你应该能够做到$user->lastPost->title,我在这里测试过它对我来说很好。
  • 哦,我的错。它完美无缺。非常感谢您的帮助。
【解决方案2】:

执行此操作的一般 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多