【问题标题】:How to run complex sql query in Laravel如何在 Laravel 中运行复杂的 sql 查询
【发布时间】:2015-01-03 05:33:26
【问题描述】:

我有一些复杂的 SQL,它由一系列非查询语句组成,它们利用 MySql 中的临时表,然后在最后使用 SELECT 语句返回结果。

例如

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;

");

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

【问题讨论】:

    标签: mysql laravel laravel-4


    【解决方案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();
    

    【讨论】:

      【解决方案2】:

      您需要查看 select() 中的 DB::raw(),但也可以尝试使用:

      DB::statement('drop table users');
      

      【讨论】:

        【解决方案3】:

        我在必须创建和运行存储过程的迁移中做了类似的事情。在我的 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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-16
          • 2021-09-11
          • 2019-05-07
          • 2019-08-05
          • 2010-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多