【发布时间】: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');
使用take()查询
$post->comments->take(5)->groupBy('parent_id')
当我使用 take() 时,它会将 JSON 输出更改为不再包含按 parent_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');
【问题讨论】:
-
我觉得 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 * fromcommentswhere post_id = 1 group byparent_idlimit 5)