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

问题描述:

我想限制laravel中的hasMany关系,但不是每个帖子都限制整个或全部记录。以下是我的解释代码。对Laravel中的每个帖子的评论限制(与帖子模型有很多关系)

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

POST2: 暂无评论在后2加载,因为它限制了整体。

预期:

POST1:

  1. 评论1
  2. 评论2

POST2:

  1. 评论1
  2. 评论2
+0

试试这个'\软件\邮政::排序依据( '的updated_at', 'DESC') - >用([ '意见'=>函数($ q){ $ q-> take(2); }]) - > get();'! – Maraboc

+0

我试过,但我给出了相同的结果 –

+1

明显的问题post2有评论? – Maraboc

我已经做了类似的事情之前,试试这个,而不是

public function comments(){ 
    return $this->hasMany(Comment::class, 'post_id')->latest()->limit(4); 
} 

您还可以添加一个全球范围桩模型,所以它总是渴望装载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); 

UPDATE:

它不工作,当我们查询这样

$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/

希望它能帮助:)

+0

感谢您的回复,但它也是一样的。我有5个职位,每个人都有评论,但它只加载4条评论的所有5个相应的职位......它应该已经加载4评论每5个职位 –

+0

@SainishMomin嗯,这很奇怪,什么是外交钥匙的职位评论表? –

+0

post_id是评论表中的外键 –