如何将此 SQL 查询转换为 Laravel 中的 eloquent
how to convert this SQL query to eloquent in Laravel
我正在尝试将此 SQL 查询转换为 Laravel
中的 Eloquent
将SQL代码转换为Eloquent
SELECT
session_id,
SUM(points) AS total_points
FROM
(
SELECT
session_id,
spent_points AS points
FROM
session_details
WHERE
session_id IN
(
" - Meagevy6y9ukbmFXvB7",
" - Meak6dG9iqvHWfAGQvy"
)
UNION ALL
SELECT
session_id,
price_points
FROM
template_sales
WHERE
session_id IN
(
" - Meagevy6y9ukbmFXvB7",
" - Meak6dG9iqvHWfAGQvy"
)
)
t
GROUP BY
session_id
我的代码在 Laravel 但不工作
$ids = ["-Meagevy6y9ukbmFXvB7","-Meak6dG9iqvHWfAGQvy"];
$query = DB::table('session_details')
->select('session_id',DB::raw('SUM(points) AS total_points FROM ( SELECT session_id, spent_points AS points FROM session_details
WHERE session_id IN ("'.$ids.'") UNION ALL SELECT session_id,price_points FROM template_sales WHERE session_id IN ("'.$ids.'") ) t GROUP BY session_id'))
->get();
我建议您使用 Eloquent 模型和 Eloquent 关系以使查询更具可读性。
在您的终端中执行以下命令以创建新模型:
php artisan make:model SessionDetail
打开 Laravel 在 /app/Models(或您的模型所在的任何文件夹)中为您生成的文件,并通过将以下内容 table 设置在模型中 属性 进入模型 class: public $table = "session_details";
如果您的模型不使用或没有 Laravel 时间戳,通常是 created_at 和 updated_at,您也可以使用此 属性 在模型中禁用它们: public $timestamps = false;
之后,通过在终端中执行以下命令来创建生成另一个模型:
php artisan make:model TemplateSale
再次按照相同的说明操作,但这次将 table 名称更改为 template_sales
完成后,进入 SessionDetail 模型并使用以下代码建立与 TemplateSale 模型的关系(这必须在模型 class 属性下方):
public function template_sales() {
return $this->hasMany(TemplateSale::class);
}
之后,您可以用这行代码替换您的查询:
$query = \App\Models\SessionDetail::select("session_id", "SUM(points) as total_points")->whereIn("session_id", $ids)->get();
要从该查询中获取模板销售额,您必须使用 $query->template_sales;
如果我有任何错误,请告诉我,我会尽快修复
您的查询中的所有操作都有可用的文档。
- 对于选定的列,使用
select('column1', 'column2', ...)
- 对于选定的聚合列,使用
selectRaw('sum(column) as column')
- 对于
WHERE column IN (...)
使用 whereIn('column', $array)
- 对于子查询表,使用
Closures
或Builder
类(DB::table(fn($q) => ... , alias)
或DB::table($builder, alias)
)
- 对于
UNION ALL
使用 unionAll()
,语法与子查询表相同。
选项 1:闭包
$ids = ["-Meagevy6y9ukbmFXvB7","-Meak6dG9iqvHWfAGQvy"];
$query = DB::table(function ($sub) use ($ids) {
$sub->select('session_id', 'spent_points as points')
->from('session_details')
->whereIn('session_id', [1,2])
->unionAll(function ($union) use ($ids) {
$union->select('session_id', 'price_points')
->from('template_sales')
->whereIn('session_id', $ids);
});
}), 't')
->select('session_id')
->selectRaw('sum(points) as total_points')
->groupBy('session_id')
->get();
选项 2:生成器(或从内到外转换子查询)
$ids = ["-Meagevy6y9ukbmFXvB7","-Meak6dG9iqvHWfAGQvy"];
$union = DB::table('template_sales')
->select('session_id', 'price_points')
->whereIn('session_id', $ids);
$sub = DB::table('session_details')
->select('session_id', 'spent_points as points')
->whereIn('session_id', $ids)
->unionAll($union);
$query = DB::table($sub, 't')
->select('session_id')
->selectRaw('sum(points) as total_points')
->groupBy('session_id')
->get();
选择你喜欢的。两者都对您发布的相同查询进行评估。
我正在尝试将此 SQL 查询转换为 Laravel
中的 Eloquent将SQL代码转换为Eloquent
SELECT
session_id,
SUM(points) AS total_points
FROM
(
SELECT
session_id,
spent_points AS points
FROM
session_details
WHERE
session_id IN
(
" - Meagevy6y9ukbmFXvB7",
" - Meak6dG9iqvHWfAGQvy"
)
UNION ALL
SELECT
session_id,
price_points
FROM
template_sales
WHERE
session_id IN
(
" - Meagevy6y9ukbmFXvB7",
" - Meak6dG9iqvHWfAGQvy"
)
)
t
GROUP BY
session_id
我的代码在 Laravel 但不工作
$ids = ["-Meagevy6y9ukbmFXvB7","-Meak6dG9iqvHWfAGQvy"];
$query = DB::table('session_details')
->select('session_id',DB::raw('SUM(points) AS total_points FROM ( SELECT session_id, spent_points AS points FROM session_details
WHERE session_id IN ("'.$ids.'") UNION ALL SELECT session_id,price_points FROM template_sales WHERE session_id IN ("'.$ids.'") ) t GROUP BY session_id'))
->get();
我建议您使用 Eloquent 模型和 Eloquent 关系以使查询更具可读性。
在您的终端中执行以下命令以创建新模型:
php artisan make:model SessionDetail
打开 Laravel 在 /app/Models(或您的模型所在的任何文件夹)中为您生成的文件,并通过将以下内容 table 设置在模型中 属性 进入模型 class: public $table = "session_details";
如果您的模型不使用或没有 Laravel 时间戳,通常是 created_at 和 updated_at,您也可以使用此 属性 在模型中禁用它们: public $timestamps = false;
之后,通过在终端中执行以下命令来创建生成另一个模型:
php artisan make:model TemplateSale
再次按照相同的说明操作,但这次将 table 名称更改为 template_sales
完成后,进入 SessionDetail 模型并使用以下代码建立与 TemplateSale 模型的关系(这必须在模型 class 属性下方):
public function template_sales() {
return $this->hasMany(TemplateSale::class);
}
之后,您可以用这行代码替换您的查询:
$query = \App\Models\SessionDetail::select("session_id", "SUM(points) as total_points")->whereIn("session_id", $ids)->get();
要从该查询中获取模板销售额,您必须使用 $query->template_sales;
如果我有任何错误,请告诉我,我会尽快修复
您的查询中的所有操作都有可用的文档。
- 对于选定的列,使用
select('column1', 'column2', ...)
- 对于选定的聚合列,使用
selectRaw('sum(column) as column')
- 对于
WHERE column IN (...)
使用whereIn('column', $array)
- 对于子查询表,使用
Closures
或Builder
类(DB::table(fn($q) => ... , alias)
或DB::table($builder, alias)
) - 对于
UNION ALL
使用unionAll()
,语法与子查询表相同。
选项 1:闭包
$ids = ["-Meagevy6y9ukbmFXvB7","-Meak6dG9iqvHWfAGQvy"];
$query = DB::table(function ($sub) use ($ids) {
$sub->select('session_id', 'spent_points as points')
->from('session_details')
->whereIn('session_id', [1,2])
->unionAll(function ($union) use ($ids) {
$union->select('session_id', 'price_points')
->from('template_sales')
->whereIn('session_id', $ids);
});
}), 't')
->select('session_id')
->selectRaw('sum(points) as total_points')
->groupBy('session_id')
->get();
选项 2:生成器(或从内到外转换子查询)
$ids = ["-Meagevy6y9ukbmFXvB7","-Meak6dG9iqvHWfAGQvy"];
$union = DB::table('template_sales')
->select('session_id', 'price_points')
->whereIn('session_id', $ids);
$sub = DB::table('session_details')
->select('session_id', 'spent_points as points')
->whereIn('session_id', $ids)
->unionAll($union);
$query = DB::table($sub, 't')
->select('session_id')
->selectRaw('sum(points) as total_points')
->groupBy('session_id')
->get();
选择你喜欢的。两者都对您发布的相同查询进行评估。