首页 > 解决方案 > 如何在 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();

标签: phpsqllaraveleloquentlaravel-7

解决方案


我建议您使用 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;

如果我有什么问题,请告诉我,我会尽快修复


推荐阅读