【问题标题】:Laravel hasMany sub-queryLaravel 有很多子查询
【发布时间】:2018-07-24 19:25:45
【问题描述】:

我有一个 laravel hasMany 关系,我想从表中获取最后 10 个 cmets 并按降序排列它们。 这就是我的桌子的样子

id  |   user_id |   comment_text
----------------------------------------------------------
1       30          foo
2       23          bar
3       17          hello
4       30          world
5       12          lorem
6       10          ipsum
7       17          dummy

我的结果应该是

id  |   user_id |   comment_text
----------------------------------------------------------
5       12          lorem
6       10          ipsum
7       17          dummy    

我如何运行查询以获得预期结果

SELECT * FROM (
    SELECT * FROM comments ORDER BY id DESC LIMIT 3
) sub
ORDER BY id ASC

如何在 laravel 模型中做到这一点?我可以在关系中运行子查询吗?这是我目前的实现

public function latestComments($limit = 3)
  {
    return $this->hasMany(Comment::class)     
      ->orderByDesc('id')
      ->limit($limit);
  }

【问题讨论】:

  • 为什么不需要子查询。
  • @LeoinstanceofKelmendi 为什么?我已经编辑了代码以显示我的预期结果
  • 使用范围https://laravel.com/docs/5.6/eloquent#local-scopes
  • @sammyukavi 您可以使用 btl 或我的解决方案,btl 答案被认为是一种更好的做法
  • 我很欣赏这些解决方案,但没有一个能达到预期的效果。

标签: php sql laravel


【解决方案1】:

你是在正确的道路上,只是稍微纠正一下:

public function latestComments($limit = 3)
{
     return $this->hasMany(Comment::class)     
        ->orderBy('id', 'desc')
        ->take($limit);
}

您可以在official docs 上阅读更多关于takeorderBy 的内容

【讨论】:

  • 我很欣赏你的努力,我不想这么说,但请看看我的预期结果
  • 您只需将$limit 更新为 3 而不是您发布的 10,我已经更新了答案
【解决方案2】:

我找到了解决办法。使用 Laravel 的 reversefunction 我能够得到想要的结果,我需要做的就是在属性上调用 reverse

$post->latestComments->reverse()

【讨论】:

    猜你喜欢
    • 2020-05-02
    • 2023-02-13
    • 2017-06-15
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2012-08-27
    相关资源
    最近更新 更多