如何使用Laravel执行包含多条语句的原始SQL查询

17

有没有办法使用Laravel框架执行像下面这样的多个语句的查询。 我已经尝试使用DB::statement,但返回一个SQL语法错误,但是当我在phpmyadmin上执行相同的查询时它可以正常工作,这真的很令人沮丧。请帮帮我。

例子

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调用来完成这个任务,每个语句一个。 - DevK
2个回答

43

DB::unprepared()应该就可以解决问题,laravel准备并执行一些sql查询。
但是你也可以使用完全原始的方法,使用DB::unprepared

例如:

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错误。 - Eddie Dane
3
是的,这就是为什么它被称为"未准备好":因此您不能使用准备好的语句。您可以尝试一种替代方法,将所有参数分组到一个数组中,将查询视为字符串,并按顺序用数组中相应的参数逐个替换"?",然后将字符串发送到DB::unprepared方法 :) - TheSalamov

2

感谢 @TheSalamov

我想用Laravel中的一般PHP例子来说明。

$result = DB::unprepared("LOCK TABLE table1 READ, table1 WRITE, table2 READ, table3 READ;"  
    .  $query_multi_stmt 
    .  " UNLOCK TABLES;");

if ($result > 0 ){  //...if rows affected
           //...do something
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接