2014-11-06 98 views
4

我有一些複雜的SQL,它由一系列非查詢語句組成,這些語句使用MySql中的臨時表,然後在最後使用SELECT語句返回結果。如何在Laravel中運行復雜的SQL查詢

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 statment的結果?

我試過在laravel中做這樣的事情,但它給了我一個MySql語法錯誤,這很奇怪,因爲確切的SQL工作正常,當我直接在MySQl中運行它。

DB::select(" 

    DROP TABLE IF EXISTS temp_foo; 

    CREATE TEMPORARY TABLE IF NOT EXISTS temp_foo AS (
     SELECT * 
     FROM foo 
    ); 

    SELECT * from temp_foo; 

"); 

任何想法如何使這項工作?

回答

1

您需要使用DB ::原料(),使您的查詢工作,例如:

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(); 
0

你需要看看DB ::原始()內的select(),而且還嘗試使用此:

DB::statement('drop table users'); 
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);