【问题标题】:Laravel DB run two queries at once (SELECT/UPDATE)Laravel DB 一次运行两个查询(SELECT/UPDATE)
【发布时间】:2020-03-27 02:18:51
【问题描述】:

我有一张表将一些记录存储为 JSON。我正在尝试从 JSON 列中增加键的数值。下面是我在 Laravel 中使用 DB 外观执行的查询。

DB::connection()
  ->select("

    SELECT CAST(JSON_EXTRACT(consumed, '$.max_users') AS INT) INTO @tmp
    FROM subscriptions
    WHERE `id` = '2';

    UPDATE subscriptions  
    SET consumed = JSON_SET(consumed, '$.max_users', @tmp+1)
    WHERE `id` = '2'; 

");

它在 PhpMyAdmin 中运行良好,但是当尝试从 Laravel 执行它时会引发异常,即 SQL 语法不正确(哪里不正确?)。

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UPDATE subscriptions SET consumed = JSON_SET(consumed, '$.max_users', ' at line 5 (SQL: SELECT CAST(JSON_EXTRACT(consumed, '$.max_users') AS INT) INTO @tmp FROM subscriptions WHEREid= '2'; UPDATE subscriptions SET consumed = JSON_SET(consumed, '$.max_users', @tmp+1) WHEREid= '2'; )

我怀疑select() 不允许同时运行两个不同的查询。但是在这种特殊情况下,我需要它们以便使用 @tmp 变量。我可以使用 PHP 检索第一个查询的值并将其传递给第二个查询,但为了论证,如何在 Laravel 中一次运行两个 DB 选择? ????

【问题讨论】:

  • 您不能在 select() 方法中运行 UPDATE 查询。将它们连接在一起并将其作为单个更新查询运行。
  • @Qirel 您实际上可以在select() 中运行您想要的任何单个查询,只是没有要返回的结果集,所以它没有多大意义

标签: php mysql laravel select laravel-query-builder


【解决方案1】:

您可以使用单个更新查询来增加此值:

UPDATE subscriptions  
    SET consumed = JSON_SET(consumed, '$.max_users', CAST(JSON_EXTRACT(consumed, '$.max_users') AS INT) + 1)
    WHERE `id` = '2'; 

【讨论】:

    猜你喜欢
    • 2017-11-17
    • 2016-11-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多