Laravel 在不影响JSON输出的情况下,使用group by限制结果量?
我正试图通过将父ID分组在一起并使用take限制结果来构建一个线程注释系统 评论表Laravel 在不影响JSON输出的情况下,使用group by限制结果量?,laravel,eloquent,Laravel,Eloquent,我正试图通过将父ID分组在一起并使用take限制结果来构建一个线程注释系统 评论表 $table->increments('id'); $table->text('content'); $table->integer('post_id'); $table->integer('parent_id')->index()->nullable(); $table->string('username'
$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');
$post->comments->take(5)->groupBy('parent_id')
使用take()查询
$post->comments->groupBy('parent_id');
$post->comments->take(5)->groupBy('parent_id')
当我使用take()
时,它将JSON输出更改为不再包含按父id分组的键
如何在不影响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');
这是由
json\u encode()
处理带有数字键的数组的方式造成的
在没有->take(5)
的情况下,数组键是[0,1,6,9]
。它们不是顺序的,因此被编码为JSON对象
在使用->take(5)
的情况下,数组键是[0,1]
。它们是连续的,因此被编码为JSON数组
您可以通过对无父注释使用
null
而不是0
来解决此问题。一般来说,使用null
表示不存在的数据也是一个更好的解决方案。我认为使用雄辩是不可能的,但您可以尝试使用查询:我也这么认为,但是你知道我是如何进行原始查询的吗?显示要使用的实际查询,而不是下一个访问此问题的人可能会死掉的链接,这将非常有用;您将查询放在那里,就像链接示例一样。您知道该查询是什么样子吗?我明白了:$comments=DB::table('comments')->whereRaw('post_id=1')->groupBy('parent_id')->limit(5)->get()代码>错误我正在获取SQLSTATE[42000]:语法错误或访问冲突:1055“threaded.comments.id”不在分组依据中(SQL:select*fromcomments
where post\u id=1 groupbyparent\u id
limit 5)您能就答案给出反馈吗?