【问题标题】:Limit amount of results using group by without affecting JSON output?使用 group by 限制结果数量而不影响 JSON 输出?
【发布时间】:2018-08-07 06:22:00
【问题描述】:

我正在尝试通过将 parent_id 组合在一起来构建一个线程化 cmets 系统,并使用 take 来限制结果。

评论表

$table->increments('id');
        $table->text('content');
        $table->integer('post_id');
        $table->integer('parent_id')->index()->nullable();
        $table->string('username');
        $table->string('user_image')->default('http://lorempixel.com/60/60/people/');
        $table->timestamps();

当我不使用take() 来限制结果时,JSON 输出按预期为groupedBy('parent_id')

不带take()的查询

$post->comments->groupBy('parent_id');

JSON Output example

使用take()查询

$post->comments->take(5)->groupBy('parent_id')

当我使用 take() 时,它会将 JSON 输出更改为不再包含按 parent_id 分组的键。

JSON Output example

如何限制结果而不影响 JSON 输出?

已编辑

后控制器

public function index(Post $post)
{
   $comments = $post->comments->groupBy('parent_id');
   return $comments;
}

编辑

为什么其他回复从这个帖子中被删除了?

编辑 2

奇怪的是,这个查询是根据我设置的限制工作的。因此,如果我将限制设置为像 5 这样的下限,我会按正常输出的键和 JSON 进行分组。但是,如果我将限制设置为 5,我将无法获得这些密钥。请参阅上面的 JSON 输出:

$comments = DB::table('comments')
                    ->where('post_id',1)
                    ->orderByDesc('created_at')
                    ->limit(7)
                    ->get();

return collect($comments)->groupBy('parent_id');

【问题讨论】:

  • 我觉得 eloquent 是不可能的,但是你可以试试查询:sqlines.com/mysql/how-to/get_top_n_each_group
  • 我也是这么想的,但是你知道我是怎么做这个原始查询的吗?
  • 显示要使用的实际查询而不是下一个访问此问题的人可能会失效的链接真的很有用。
  • 你可以使用 DB::select ('select id, ... from ....');您将查询放在那里,如链接示例中所示
  • 知道该查询是什么样的吗?我得到了这个:$comments = DB::table('comments') ->whereRaw('post_id = 1') ->groupBy('parent_id') ->limit(5) ->get(); 我遇到的错误 SQLSTATE[42000]: 语法错误或访问冲突:1055 'thread.cmets.id' 不在 GROUP BY 中(SQL: select * from comments where post_id = 1 group by parent_id limit 5)

标签: laravel eloquent


【解决方案1】:

这是由json_encode() 处理带有数字键的数组的方式引起的。

在没有->take(5)的情况下,数组键是[0, 1, 6, 9]。它们不是连续的,因此被编码为 JSON 对象。

->take(5) 的情况下,数组键是[0, 1]。这些是顺序的,因此被编码为 JSON 数组。

对于无父 cmets,您可以使用 null 而不是 0 来解决此问题。使用null来表示不存在的数据,一般来说也是比较好的解决方案。

【讨论】:

  • 您能否就答案提供反馈?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
相关资源
最近更新 更多