【问题标题】:How to execute a raw sql query with multiple statement with laravel如何使用 laravel 执行带有多个语句的原始 sql 查询
【发布时间】:2018-10-30 12:44:16
【问题描述】:

无论如何,我可以使用 laravel 框架执行具有多个语句的查询,如下所示。 我曾尝试使用DB::statement,但返回了一个 sql 语法错误,但是当我在 phpmyadmin 上执行相同的查询时,我可以工作,这太令人沮丧了。 请帮帮我。

EG

LOCK TABLE topics WRITE;

SELECT @pRgt := rgt FROM topics WHERE id = ?;

UPDATE topics SET lft = lft + 2 WHERE rgt > @pRgt;
UPDATE topics SET rgt = rgt + 2 WHERE rgt >= @pRgt;

INSERT INTO topics (title, overview, article, image, lft, rgt)
VALUES (?, ?, ?, ?, @pRgt, @pRgt + 1);

UNLOCK TABLES;

【问题讨论】:

  • 我相信您需要为此使用 7 个 DB::statement 调用,每个语句调用一个

标签: php mysql laravel


【解决方案1】:

DB::unprepared() 应该可以解决问题,laravel 准备并为 sql 查询做一些事情。
但是您可以使用 DB::unprepared 来使用绝对原始的。

EG

DB::unprepared('LOCK TABLE topics WRITE;

SELECT @pRgt := rgt FROM topics WHERE id = ?;

UPDATE topics SET lft = lft + 2 WHERE rgt > @pRgt;
UPDATE topics SET rgt = rgt + 2 WHERE rgt >= @pRgt;

INSERT INTO topics (title, overview, article, image, lft, rgt)
VALUES (?, ?, ?, ?, @pRgt, @pRgt + 1);

UNLOCK TABLES;');

无论是单条/多条语句,它都会执行你的整个 SQL 查询。

【讨论】:

  • 哇,非常感谢,但不幸的是,这种方法没有绑定像 DB::unprepared('select * from table where id = :id', ['id' => 1]) 这样的值会抛出 sql 错误。
  • 是的,这就是为什么它被称为 unprepared :) 所以你不能使用准备好的语句你可以尝试另一种方法尝试将所有参数分组到一个数组中,将你的查询视为一个字符串并替换 ' ?依次使用数组中的相应参数,然后将您的字符串发送到 DB::unprepared 方法:)
猜你喜欢
  • 2016-05-10
  • 2016-01-08
  • 2022-01-20
  • 1970-01-01
  • 2020-04-29
  • 2012-01-28
  • 1970-01-01
  • 2017-04-08
相关资源
最近更新 更多