3 votes

Tri par la somme des valeurs qui sont dans la colonne de la table de relation

J'ai ces relations similaires à celle de la documentation et les relations sont fixées. les posts ont beaucoup de commentaires et de taux. les commentaires ont beaucoup de taux. C'est une relation polymorphe.

posts
    id - integer
    user_id -integer
    body - text

comments
    id - integer
    post_id - integer
    user_id - integer
    body - string

rates
    id - integer
    user_id - integer
    rate - integer
    likable_id - integer
    likable_type - string 

Comment puis-je classer les messages et les commentaires les plus fréquents ? J'obtiens les messages et les taux respectifs de cette façon, mais les messages sont classés par ID par défaut, de même que les commentaires.

$posts=Post::with('comments','comments.rates','rates')->get();
foreach($posts as $post)
{
      $post=$post->body;   //post
      foreach($post->comments as $comment)
      {
          $comment=$comment->body;      //comment
          $rateofcomment=$comment->rates->sum('rate');  //rate of comment
      }
      $rateofpost=$post->rates->sum('rate');  //rate of post
}

Mise à jour modifié dans post.php et comment.php

public function rates()
{
    return $this->morphOne('App\Rate', 'likable')
                ->selectRaw('SUM(rate) as rateSum, likable_id')
                ->groupBy('likable_id');
}

et dans rate.php

 public function likable()
    {
        return $this->morphTo();
    }

En fait, ce code ci-dessous a fonctionné pour le premier du post. signifie que si je meurs ; le reste de l'exécution foreach il a affiché les taux.

$posts=Post::with('comments','comments.rates','rates')->get();
       foreach($posts as $post)
        {
              $post=$post->body;   //post
              $rateofpost = $post->rates->rateSum;
              print_r($rateofpost); die;

Mais si j'essaie de compléter la boucle foreach, il affiche l'erreur familière Trying to get property of non object ? c'est parce que tous les messages et commentaires peuvent ne pas avoir rateSum. Comment puis-je éviter cela ?

3voto

sha-1 Points 875

Il existe peut-être d'autres moyens de résoudre ce problème. Mais vous pouvez utiliser Trier par o triByDesc Méthode de collecte pour résoudre votre problème.

$posts=Post::with('comments','comments.rates','rates')->get();
foreach($posts as $post)
{
  $post->rating = $post->rates->sum('rate');
  foreach($post->comments as $comment)
  {
      $comment->rating = $comment->rates->sum('rate');
  }
  $post->comments = $post->comments->sortByDesc('rating');
}
$posts = $posts->sortByDesc('rating');

Ici, il vous suffit d'ajouter une propriété à votre collection en utilisant les valeurs d'évaluation. Et ensuite trier les collections en fonction de cette évaluation.

Mise à jour :

Ajoutez la méthode suivante à votre modèle Post.php y Commentaire.php .

public function rates()
{
    return $this->morphOne('App\Rate', 'likable')
                ->selectRaw('SUM(rate) as rateSum, likable_id')
                ->groupBy('likable_id');
}

Et le code suivant dans votre modèle Taux.php (Si vous n'en avez pas déjà un).

public function likable()
{
    return $this->morphTo();
}

Maintenant, vous pouvez coder comme ceci .

$posts = Post::with('comments','comments.rates','rates')->get()->sortByDesc('rates.rateSum');
foreach($posts as $post)
{
  $post=$post->body;
  $post->comments = $post->comments->sortByDesc('rates.rateSum');
  foreach($post->comments as $comment)
  {
      $comment = $comment->body;
      $rateofcomment = $comment->rates->rateSum;
  }
  $rateofpost = $post->rates->rateSum;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X