Как выполнить сложный sql-запрос в Laravel

91
10

У меня есть сложный 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;


Как я могу запустить все это в одном вызове DB из Laravel и получить результаты этого последнего состояния SELECT?


Я пробовал делать что-то подобное в 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;

");


Любые идеи о том, как это сделать?

спросил(а) 2014-11-06T19:11:00+03:00 5 лет, 11 месяцев назад
1
Решение
58

Вам нужно использовать 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();

ответил(а) 2014-11-06T21:35:00+03:00 5 лет, 11 месяцев назад
42

Я сделал что-то подобное в миграции, где мне приходилось создавать и запускать хранимую процедуру. в моем 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);

ответил(а) 2014-11-06T21:47:00+03:00 5 лет, 11 месяцев назад
42

Вам нужно посмотреть DB:: raw() внутри select(), но также попробуйте использовать это:


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

ответил(а) 2014-11-06T21:25:00+03:00 5 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема