【问题标题】:How to convert MySql code in laravel code?如何在 laravel 代码中转换 MySql 代码?
【发布时间】:2019-08-28 23:02:30
【问题描述】:

我在 laravel 中构建博客应用程序,为此我使用 3 个表:用户帖子和评分。用户登录后,他可以对帖子进行评分。所以我在帖子表中添加了列 avgRating 来存储每个帖子的平均评分。

我尝试在没有 laravel 的情况下在 mysql 中执行这段代码。

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();

  }

它没有做任何事情。任何人都可以解释如何在 laravel 中做到这一点?

【问题讨论】:

  • toSql();方法?
  • 你只是在创建一个表达式,而不是运行一个语句。您可以将DB::raw() 替换为DB::statement()
  • ok @aynber 我会试试 DB::statement()
  • 不要忘记运行 COMMIT 假设在 MySQL 服务器级别或会话级别禁用自动提交..
  • @RaymondNijland 我不明白你的意思?我是 laravel 的新手,我在这里写的这个函数在我只使用纯 php 的应用程序中工作,没有框架。我只需要在我的一个视图文件中调用它并将数据存储在数据库中,现在在 laravel 我不知道该怎么做

标签: php mysql laravel


【解决方案1】:

首先,您没有进行选择以期望返回帖子列表的结果。

其次,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();

【讨论】:

  • 您的查询未正确构建。编辑了我的答案
  • 我试过了,但它不起作用。我认为我的查询很好,因为当我在 phpmyadmin 中手动运行它时,它做了我想要的。我还需要在代码中的某处调用该函数吗...
  • @Niki 允许自动提交与 SET 中的相关子查询,N69S 对此是错误的,但是当可以使用索引时,LEFT JOIN 最有可能效果更好.. 我认为 lavarel 禁用了 MySQL 的自动提交会话尝试 COMMIT 之后..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 2022-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多