我有这些关系类似于文档和关系的设置。帖子有很多评论和评价。评论有很多费率。这是一种多态关系。
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。我怎么能避免这个?
答案 0 :(得分:3)
可能还有其他方法可以解决这个问题。但您可以使用sortBy或sortByDesc收集方法来解决您的问题。
$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;
}