提问人:micky 提问时间:9/11/2016 最后编辑:micky 更新时间:9/16/2016 访问量:998
按关系表列中的值之和排序
Sorting by the sum of values that are in relation table column
问:
我有这些类似于文档的关系,并设置了关系。帖子有很多评论和费率。评论有很多费率。它是一种多态关系。
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。我怎样才能避免这种情况?
答:
2赞
sha-1
9/12/2016
#1
可能还有其他方法可以解决这个问题。但是您可以使用 sortBy 或 sortByDesc 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 以及他们的费率。
上一个:将序列号与分页一起使用
下一个:设置 rpy2
评论
rateSum
rates