我试图检索(分页)帖子列表,并在一个Eloquent查询语句中包含其最新评论。帖子和评论通过一对多关系相连。在1个查询中检索所有帖子及其最新评论
这是我的尝试:
Post::with(['comments' => function ($query) {
$query->orderBy('created_at', 'asc')->take(3);
}])->simplePaginate(15);
但是,只检索总3条评论,平均每个职位不是3个评论。
我试图检索(分页)帖子列表,并在一个Eloquent查询语句中包含其最新评论。帖子和评论通过一对多关系相连。在1个查询中检索所有帖子及其最新评论
这是我的尝试:
Post::with(['comments' => function ($query) {
$query->orderBy('created_at', 'asc')->take(3);
}])->simplePaginate(15);
但是,只检索总3条评论,平均每个职位不是3个评论。
修订
看来你不能用1个查询做到这一点。
您仍然可以在父模型此功能,被称为“lastComments”:
function lastComments()
{
return $this->hasMany('App\Post', 'post_id')->orderBy('created_at')->take(3);
}
您加载信息与正常雄辩代码:
Post::simplePaginate(15);
并在视图页面显示您的评论这种方式:
@foreach($post->lastComments as $comment)
<!-- ... -->
@endforeach
据我可以看到,产生相同的结果,总共只有3条评论加载。 – Antiz
我更新了答案 –
加入表ID是必要
试试这个:
Post::with(array('comments'=>function($query){
$query->select('id as commentid','comment')->orderBy('created_at', 'asc')->take(3);
}))->simplePaginate(15);
这并没有为我产生任何结果。选择函数('comment')的第二个参数有什么用? – Antiz
您需要设置$with
变量在App\Post
型号:
protected $with = ['lastComments'];
这只要你取一个帖子的方式,Laravel会自动加载的意见吧。
我不认为laravel允许你限制渴望加载的关系。我会建议迭代后数组并加载评论,例如: $ posts = Post :: simplePaginate(15); foreach($ posts as post){$ post-> load(['comments'=> function($ query){$ query-> orderBy('created_at','asc') - > take(3);}]) ' – pseudoanime