我有一些复杂的SQL,它包含一系列非查询语句,它们在MySql中使用临时表,然后在末尾使用SELECT语句来返回结果。
e.g
DROP TABLE IF EXISTS temp_foo;
CREATE TEMPORARY TABLE IF NOT EXISTS temp_foo AS (
SELECT *
FROM foo
);
SELECT * from temp_foo;
如何在Laravel的一次DB调用中运行这一切并获取最后一个SELECT语句的结果?
我已尝试在laravel中执行此类操作,但它给我一个MySql语法错误,这很奇怪,因为当我在MySQl中直接运行时,确切的sql工作正常。
DB::select("
DROP TABLE IF EXISTS temp_foo;
CREATE TEMPORARY TABLE IF NOT EXISTS temp_foo AS (
SELECT *
FROM foo
);
SELECT * from temp_foo;
");
关于如何使这项工作的任何想法?
答案 0 :(得分:1)
您需要使用DB :: raw()来使查询起作用,例如:
DB::select(DB::raw("
DROP TABLE IF EXISTS temp_foo;
CREATE TEMPORARY TABLE IF NOT EXISTS temp_foo AS (
SELECT *
FROM foo
);
SELECT * from temp_foo;
"));
我认为甚至可以简单地使用selectRaw()
,但我不确定。此外,您可以选择temp_foo
中的所有行,如下所示:
DB::table('temp_foo')->get();
答案 1 :(得分:0)
你需要在select()中查看DB :: raw(),但也可以尝试使用:
DB::statement('drop table users');
答案 2 :(得分:0)
我在迁移中做了类似的事情,我必须创建并运行存储过程。在我的up()中我使用了这样的东西。
public function up() {
$sql = <<<SQL
DROP TABLE IF EXISTS temp_foo;
CREATE TEMPORARY TABLE IF NOT EXISTS temp_foo AS (
SELECT *
FROM foo
);
SELECT * from temp_foo;
SQL;
DB::connection()->getPdo()->exec($sql);
}
您可以使用
DB::connection()->getPdo()->exec($sql);