Laravel / Eloquent - 如何同时运行多个原始SQL语句?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel / Eloquent - 如何同时运行多个原始SQL语句?相关的知识,希望对你有一定的参考价值。
我有多个我希望通过Eloquent运行的SQL语句。他们看起来像这样:
CREATE TEMPORARY TABLE cars
AS (SELECT cars.id, cars.ip_address
FROM cars
JOIN colors ON colors.ip_address = cars.ip_address);
CREATE TEMPORARY TABLE boats
AS (SELECT ip_address, MIN(id) AS id
FROM colors
GROUP BY ip_address);
CREATE TEMPORARY TABLE rvs
AS (SELECT rvs.id, rvs.ip_address
FROM rvs
LEFT JOIN colors ON colors.id = rvs.id
WHERE colors.id IS NULL);
/* Do things with temp tables here */
我需要所有这些语句在一个连接会话中运行,因为它们使用的是临时表。我已经尝试使用DB::statement()
,它在第二个语句操作开始时出错,还有DB::unprepared()
,它似乎没有运行任何操作。
有没有办法使用Eloquent运行多个原始语句?
答案
我认为你使用unprepared
声明正在走上正轨,但我觉得在你的场景中使用交易可能是有利的。此外,您将需要使用\DB::raw()
,它将执行您的SQL语句作为扁平字符串。当然,不要在这里放置任何可以由用户提供的内容,因为您已经绕过参数化查询而打开自己的SQL注入。
try {
\DB::transaction(function(){
\DB::unprepared(\DB::raw('CREATE TEMPORARY TABLE cars AS (SELECT cars.id, cars.ip_address FROM cars JOIN colors ON colors.ip_address = cars.ip_address)'));
\DB::unprepared(\DB::raw('CREATE TEMPORARY TABLE boats AS (SELECT ip_address, MIN(id) AS id FROM colors GROUP BY ip_address)'));
\DB::unprepared(\DB::raw('CREATE TEMPORARY TABLE rvs AS (SELECT rvs.id, rvs.ip_address FROM rvs LEFT JOIN colors ON colors.id = rvs.id WHERE colors.id IS NULL)'));
});
\DB::commit();
} catch (\Exception $e){
\DB::rollback();
//do something with $e->getMessage();
}
此外,这实际上是Laravel的Query Builder
而不是Eloquent
。
另一答案
您应该使用laravel自定义查询。有关详细信息,请参阅此laravel documentation
$query = DB::select("
SELECT
cars.id,
cars.ip_address,
FROM cars
JOIN colors
ON colors.ip_address = cars.ip_address
UNION
SELECT
ip_address,
MIN(id) AS id,
FROM colors
GROUP BY ip_address
UNION
SELECT
rvs.id,
rvs.ip_address,
FROM rvs
LEFT JOIN colors
ON colors.id = rvs.id
WHERE colors.id IS NULL
");
以上是关于Laravel / Eloquent - 如何同时运行多个原始SQL语句?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5:如何使用 'where' 或 'orderBy' 使用 eloquent?
如何使用 eloquent 在 laravel 中编写多个连接