按关系表列中的值之和排序

Sorting by the sum of values that are in relation table column

提问人:micky 提问时间:9/11/2016 最后编辑:micky 更新时间:9/16/2016 访问量:998

问:

我有这些类似于文档的关系,并设置了关系。帖子有很多评论和费率。评论有很多费率。它是一种多态关系。

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 

如何以最优惠的价格订购帖子和评论?我以这种方式获得帖子和相应的费率。但默认情况下,帖子是按 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
}

更新在帖子 .php 和评论 .php 中更改

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

在速率 .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循环,它会显示熟悉的错误:试图获取非对象的属性?这是因为所有帖子和评论可能都没有 rateSum。我怎样才能避免这种情况?

维尔 ·拉拉维尔-5

评论

0赞 sha-1 9/16/2016
如果您所有的帖子和评论都有,那么它是否正常工作?请检查一下。然后,我们可以为其余问题找到解决方案。:)rateSum
0赞 micky 9/16/2016
@sha-1 是的。我刚刚检查过。
0赞 micky 9/16/2016
@sha-1 使用 isset() 解决了这个问题。感谢您的所有努力,
0赞 sha-1 9/16/2016
您还可以使用 Laravel 访问器和变值器来检查 the 是否为 null,然后使用默认值。但你的也可以。感谢您将我的答案标记为已接受。:)rates

答:

2赞 sha-1 9/12/2016 #1

可能还有其他方法可以解决这个问题。但是您可以使用 sortBysortByDesc Collection 方法来解决您的问题。

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

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

更新:

将以下方法添加到模型帖子.php注释.php

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

以及您的模型速率 .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;
}

评论

0赞 micky 9/12/2016
因此,我需要再次使用 foreach 来获取帖子和评论的正文。
0赞 sha-1 9/12/2016
您可以在此 foreach 中获取帖子和评论的正文。不需要使用另一个 foreach 循环。
0赞 micky 9/12/2016
帖子和评论的正文按此 Foreach 内的评级排序。你能通过编辑答案来显示吗?
0赞 sha-1 9/12/2016
您是否需要在此 foreach 中使用帖子和评论的正文??或者您需要稍后使用它们?如果您以后需要使用它们,那么它们已经排序了。我不确定为什么你可能需要它们在这个foreach循环中。
0赞 micky 9/12/2016
是的。我需要这个 foreach 以及他们的费率。