我试图限制laravel中的hasMany关系,而不是每个帖子限制整个或所有记录。以下是我的解释代码。
class Post extends Model {
protected $table = "user_posts";
protected $appends = ['logged_in_user_id', 'comments_count'];
public function user() {
return $this->belongsTo('App\User');
}
public function comments() {
return $this->hasMany('App\Comment')->take(2);
}
}
我想在每个帖子上获得2或3条评论,如下所示
$posts = \App\Post::orderBy('updated_at', 'DESC')->with('comments')->where('user_posts.user_id', $user_id)->paginate(10);
问题不是为每个帖子提供2条评论,而是只提供所有提取帖子的2条评论。
当前结果:
POST1:
POST2: 在帖子2中没有加载评论,因为它限制了整体。
预期:
POST1:
POST2:
答案 0 :(得分:0)
在尝试此操作之前,我做了类似的事情
public function comments(){
return $this->hasMany(Comment::class, 'post_id')->latest()->limit(4);
}
您还可以将全局范围添加到Post Model,以便始终急切地加载4条评论,如下所示:
static::addGlobalScope('comments', function ($builder){
$builder->with('comments');
});
所以你的Post.php中的启动方法应如下所示:
protected static function boot()
{
parent::boot();
static::addGlobalScope('comments', function ($builder){
$builder->with('comments');
});
}
因此您可以这样查询:
$posts = \App\Post::orderBy('updated_at', 'DESC')->where('user_posts.user_id', $user_id)->paginate(10);
更新:
当我们像这样查询
时,它不起作用$posts = \App\Post::orderBy('updated_at', 'DESC')->where('user_posts.user_id', $user_id)->paginate(10);
因为限制只应用一次。检查github问题https://github.com/laravel/framework/issues/4835。但是,这是一个可能的解决方案https://softonsofa.com/tweaking-eloquent-relations-how-to-get-n-related-models-per-parent/
希望它有所帮助:)