2017-10-04 58 views
1

我想限制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

回答

0

我已經做了類似的事情之前,試試這個,而不是

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是評論表中的外鍵 –