php - 如何在 Laravel 中将此 SQL 查询转换为 eloquent
问题描述
我正在尝试将此 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
在 /app/Models (或模型所在的任何文件夹)中打开 Laravel 为您生成的文件,并通过将以下属性放入模型类中来设置模型中的表:public $table = "session_details";
如果您的模型不使用或具有通常是 created_at 和 updated_at 的 Laravel 时间戳,您还可以使用此属性在模型中禁用它们:public $timestamps = false;
之后,通过在终端中执行以下命令来创建另一个模型:
php artisan make:model TemplateSale
再次按照相同的说明进行操作,但这次将表名更改为template_sales
完成后,进入 SessionDetail 模型并使用以下代码与 TemplateSale 模型建立关系(这必须在属性下方的模型类中):
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;
如果我有什么问题,请告诉我,我会尽快修复
推荐阅读
- python - 缺少循环替换
- .htaccess - Laravel 6:使用 htaccess 从 URL 中删除 Public
- java - 连接池有数百个空闲连接
- javascript - NGRX - 在单个效果的多个动作中捕捉动作
- javascript - 变量值不会在函数中更新
- powershell - Set-ADuser extensionAttribute 不起作用,但标题之类的东西会
- c# - 为什么我的 Razor 'RenderSection' 不会被孙子视图继承?
- neo4j - Neo4j 可以在 MERGE 语句后添加 WHERE 子句吗?
- azure-functions - Azure 函数无法在 Azure 门户中下载 PowerShell Core 的托管依赖项
- c++ - 关闭对话框而不显示用户“exe 已停止工作”消息