按关系表列

时间:2016-09-11 12:32:40

标签: laravel laravel-5

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

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
}

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

1 个答案:

答案 0 :(得分:3)

可能还有其他方法可以解决这个问题。但您可以使用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.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();
}

现在你可以像这样编码 -

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