【问题标题】:YII2 how to update field with query buiderYII2 如何使用查询生成器更新字段
【发布时间】:2018-02-25 16:34:39
【问题描述】:

如何在 Yii2 中使用查询生成器更新字段?

要求是表 B 表 A 中的每一笔交易都会自动更新 value 字段:actual and available

表A

  • 身份证
  • 预算
  • 实际//从表b查询金额
  • 可用 // 价值 =(预算 - 实际)

表 B

  • 身份证
  • 金额
  • tableA_id

表关系

这里是sql查询

SELECT
  DISTINCT(A.id) AS tableA,
  A.budget AS budget,
  SUM(B.amount) AS actual,
  budget - SUM(B.amount) AS Available
FROM
  tableA AS A
 LEFT JOIN
  TableB AS B
ON
  A.id = B.TableA_id
Group By
 tableA

结果

我正在努力向https://github.com/yiisoft/yii2/blob/master/docs/guide/db-dao.md#basic-sql-queries学习

但我不知道如何将 SQL 应用于 Yii2 中的查询构建器以及如何编码或将代码放在模型或控制器中的什么位置。

【问题讨论】:

  • 您的 sql 代码似乎有一些问题.. 1) 为什么 distinct 和 groyp by??如果你使用 group by 你不需要 distinct ..
  • 2) 为什么您有一个未在 group by 中提及的非聚合列? .. 这在 sql 中已弃用,并且在更新版本的数据库中不允许使用,例如:mysql 5.7
  • 3 ) 您不能在选择其他列名称或计算(预算)中使用列名称的别名
  • what do you want to do you want to update records or you want to select,你的问题标题是关于update并且你已经添加了select查询被转换为@ 987654331@语法?
  • 我很抱歉造成混乱。我的注意力是update值,先生

标签: mysql activerecord yii2 query-builder insert-update


【解决方案1】:

一个简单的解决方案可以基于 sql 命令(而不是 activeQuery)

\Yii::$app->db->createCommand('update TableA A
               inner join (
                select B.TableA_id id
                    , sum(B.amount) Available
                FROM TableB B
                GROUP BY id
               ) T  on A.id =T.id
                AND A.id = :actid
               set budget = budget - T.Available')->bindValue(':actid', $your_id)
->execute();

我已经重构了你的代码,避免了我之前评论中的问题

【讨论】:

  • 感谢您的回答。先生,你能告诉我把你的建议代码放在哪里吗?在 _form.php 或模型 tableA 或控制器 tableA
  • @ChonjaroenChauynoo 您的评论中有什么是另一个问题 .. 您已要求在联接解决方案中更新 SQL .. 我已经发布了一个 asnwer .. 所以不是编码服务并在问题中添加问题不公平..所以如果我的答案是正确的,您可以将其标记为已接受,如果我的答案错误,您可以向我显示错误.. 但不要将问题添加到另一个问题
  • @ChonjaroenChauynoo 将其添加到您的模型中创建一个函数,并通过您用于更新控制器中的值的操作调用它
  • @scaisEdge 再次感谢您的回答并为错误道歉。请让我先试试你的说法,完成后我会更新你。
  • @MuhammadOmerAslam 谢谢你的建议,先生
【解决方案2】:

您为什么不使用计算的值创建一个视图?因此,当您访问视图时,会即时计算“实际”和“可用”数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2020-12-25
    • 2018-06-09
    • 2013-09-29
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多