如何在Laravel中运行复杂的SQL查询

时间:2014-11-06 16:11:12

标签: mysql laravel laravel-4

我有一些复杂的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;

");

关于如何使这项工作的任何想法?

3 个答案:

答案 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);