2017-10-04 3 views
1

J'essaie de limiter sur hasMany relation dans laravel mais au lieu de chaque poste il limite sur l'ensemble ou tous les enregistrements. Voici mon code pour l'explication.Limite sur le commentaire (hasMany relation avec Post modèle) pour chaque poste dans 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); 
    } 
} 

Je suis en train de faire 2 ou 3 commentaires récents sur chaque poste ci-dessous

$posts = \App\Post::orderBy('updated_at', 'DESC')->with('comments')->where('user_posts.user_id', $user_id)->paginate(10); 

problème est au lieu de donner 2 commentaires pour chaque poste, il ne donne que 2 commentaires de tous le poste tiré par les cheveux .

Résultat courant:

Post1:

  1. Commentaire 1
  2. commentaire 2

Post2: Aucun commentaire chargé en poste 2, car elle limite sur tout.

attendu:

post1:

  1. commentaire 1
  2. commentaire 2

post2:

  1. commentaire 1
  2. commentaire 2
+0

Try this '\ App \ Poster :: orderBy ('updated_at', 'DESC') -> avec ([fonction => 'commentaires' ($ q) { $ q-> take (2); }]) -> get(); '!! – Maraboc

+0

J'ai essayé cela mais je donne le même résultat –

+1

Question évidente a post2 a des commentaires ?? – Maraboc

Répondre

0

je l'ai fait quelque chose avant d'essayer même ce lieu

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

Vous pouvez également ajouter une portée globale au modèle Post, de sorte qu'il est toujours prêt à charger les 4 commentaires comme si:

static::addGlobalScope('comments', function ($builder){ 
     $builder->with('comments'); 
    }); 

de sorte que votre méthode de démarrage dans votre Post.php devrait ressembler à ceci:

protected static function boot() 
{ 
    parent::boot(); 

    static::addGlobalScope('comments', function ($builder){ 
     $builder->with('comments'); 
    }); 

} 

donc vous pouvez interroger comme ceci:

$posts = \App\Post::orderBy('updated_at', 'DESC')->where('user_posts.user_id', $user_id)->paginate(10); 

MISE À JOUR:

cela ne fonctionne pas, lorsque nous interrogeons comme cette

$posts = \App\Post::orderBy('updated_at', 'DESC')->where('user_posts.user_id', $user_id)->paginate(10); 

car la limite est appliquée une seule fois. Vérifiez le problème de github https://github.com/laravel/framework/issues/4835.Cependant, voici une solution possible https://softonsofa.com/tweaking-eloquent-relations-how-to-get-n-related-models-per-parent/

it helps :)

+0

Merci pour la réponse, Mais il fait la même chose. J'ai 5 post et et chacun a des commentaires mais il charge seulement 4 commentaires pour tous les 5 messages correspondants ... Il aurait dû charger 4 commentaires pour chaque poste 5 –

+0

@SainishMomin hmmm, c'est étrange, quelle est la clé étrangère de la poste sur la table des commentaires? –

+0

post_id est la clé étrangère dans la table des commentaires –