我正在用laravel构建博客应用程序,并为此使用3个表:用户、帖子和评分。用户登录后,除其他外,还可以对帖子进行评分。因此,我在post表中添加了列avgRating来存储每个帖子的平均评分。
我试图在mysql中不使用laravel执行这段代码。
UPDATE posts p
SET p.avgRating=
(SELECT ROUND(AVG(r.rating), 0)
FROM ratings r
WHERE p.id=r.rateable_id)而且起作用了。我试着用PostController.php写成这样
public function avgRating ($avgRating) {
$posts = DB::raw('UPDATE posts p
SET p.avgRating=
(SELECT ROUND(AVG(r.rating), 0)
FROM ratings r
WHERE p.id=r.rateable_id)')->get();
}它什么也做不了。有人能解释怎么用拉拉来做这个吗?
发布于 2019-08-28 14:55:07
首先,您不做select来期望posts列表的返回结果。
其次,DB::raw()只允许您编写原始SQL,它不运行它。为此,你可以使用select(),update(),statement(),.
以你为例,你可以
DB::statement('UPDATE posts p
JOIN (
SELECT r.rateable_id, ROUND(AVG(r.rating), 0) as rounded
FROM ratings r
GROUP BY r.rateable_id
) a on p.id = a.rateable_id
SET p.avgRating=a.rounded');
$posts = Post::all();https://stackoverflow.com/questions/57695039
复制相似问题