【问题标题】:Sorting by the sum of values that are in relation table column按关系表列中的值总和排序
【发布时间】:2016-09-11 12:32:39
【问题描述】:

我有这些关系类似于文档和关系设置。帖子有很多 cmets 和 rate。 cmets 有很多费率。它是一种多态关系。

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 

如何订购价格最高的帖子和 cmets?我通过这种方式获取帖子和相应的费率。但默认情况下,帖子是按 id 排序的。评论也是一样。

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

更新 在 post.php 和 comment.php 中更改

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

在 rate.php 中

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

实际上,下面的这段代码适用于第一篇文章。意味着如果我死了; foreach 执行的其余部分显示费率。

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

但是。如果我尝试完成 foreach 循环,它会显示熟悉的错误 Trying to get property of non object?这是因为所有帖子和 cmets 可能没有 rateSum。我怎样才能避免这种情况?

【问题讨论】:

  • 如果你所有的帖子和 cmets 都有rateSum,那么它工作正常吗?请检查这个。然后我们可以为剩下的问题找出解决方案。 :)
  • @sha-1 是的。我刚刚检查过了。
  • @sha-1 用 isset() 解决了这个问题。感谢您的所有努力,
  • 您也可以使用Laravel Accessor and mutators 来检查rates 是否为空,然后使用默认值。但是你的也可以。感谢您将我的答案标记为已接受。 :)

标签: laravel laravel-5


【解决方案1】:

可能还有其他方法可以解决此问题。但是您可以使用sortBysortByDesc 收集方法来解决您的问题。

$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');

在这里,您只需使用评级值将属性添加到您的集合中。然后根据该评级对集合进行排序。

更新:

将以下方法添加到您的模型 Post.phpComment.php

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

您的模型中的以下代码Rate.php(如果您还没有)。

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

现在你可以这样编码了-

$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;
}

【讨论】:

  • 所以我需要再次使用 foreach 来获取帖子和 cmets 的正文。
  • 您可以在这个 foreach 中获取帖子和 cmets 的正文。不需要使用另一个 foreach 循环。
  • 帖子和 cmets 正文按此 foreach 中的评级排序。你能通过编辑答案来显示吗?
  • 你需要在这个 foreach 中使用帖子正文和 cmets 吗?或者您需要稍后使用它们?如果您以后需要使用它们,那么它们已经排序。我不确定你为什么在这个 foreach 循环中需要它们。
  • 是的。我需要在这个 foreach 中以及他们的费率。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
  • 2016-05-23
  • 2016-11-10
  • 1970-01-01
  • 2021-11-10
  • 2021-12-07
  • 2016-06-21
相关资源
最近更新 更多