限制Laravel中每个帖子的评论(与Post模型有很多关系)

时间:2017-10-04 14:22:44

标签: php laravel laravel-5 eloquent

我试图限制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:

  1. 评论1
  2. 评论2
  3. POST2: 在帖子2中没有加载评论,因为它限制了整体。

    预期:

    POST1:

    1. 评论1
    2. 评论2
    3. POST2:

      1. 评论1
      2. 评论2

1 个答案:

答案 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/

希望它有所帮助:)