Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

1K
Views
cómo convertir esta consulta SQL a elocuente en Laravel

Estoy tratando de convertir esta consulta SQL a Eloquent en Laravel

Convertir código SQL a 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

mi código en Laravel pero no funciona

 $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();
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Le aconsejo que use modelos Eloquent y relaciones Eloquent para que la consulta sea más legible.

Ejecute lo siguiente en su terminal para crear un nuevo modelo:

 php artisan make:model SessionDetail

Abra el archivo que Laravel ha generado para usted en /app/Models (o cualquier carpeta en la que estén sus modelos) y configure la tabla en el modelo colocando la siguiente propiedad en la clase del modelo: public $table = "session_details";

Si su modelo no usa o tiene marcas de tiempo de Laravel que generalmente se crean_en y se actualizan_en, también puede usar esta propiedad para deshabilitarlas en el modelo: public $timestamps = false;

Después de eso, cree generar otro modelo ejecutando el siguiente comando en su terminal:

 php artisan make:model TemplateSale

Siga las mismas instrucciones nuevamente, pero esta vez cambie el nombre de la tabla a template_sales

Una vez que haya hecho eso, diríjase a su modelo SessionDetail y establezca una relación con el modelo TemplateSale usando el siguiente código (debe estar en la clase del modelo debajo de las propiedades):

 public function template_sales() { return $this->hasMany(TemplateSale::class); }

Después de eso, puede reemplazar su consulta con esta línea de código:

 $query = \App\Models\SessionDetail::select("session_id", "SUM(points) as total_points")->whereIn("session_id", $ids)->get();

Para obtener las ventas de plantilla de esa consulta, debe usar $query->template_sales;

Si tengo algo mal, por favor dímelo y lo arreglaré lo antes posible.

over 4 years ago · Santiago Trujillo Report

0

Hay documentación disponible para todas las operaciones en su consulta.

  • Para las columnas seleccionadas, use select('column1', 'column2', ...)
  • Para las columnas agregadas seleccionadas, utilice selectRaw('sum(column) as column')
  • Para WHERE column IN (...) use whereIn('column', $array)
  • Para las tablas de subconsulta, use las clases Closures o Builder ( DB::table(fn($q) => ... , alias) o DB::table($builder, alias) )
  • Para UNION ALL use unionAll() con la misma sintaxis que las tablas de subconsultas.

Opción 1: Cierres

 $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();

Opción 2: Builder (o traducir las subconsultas de adentro hacia afuera)

 $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();

Elige el que prefieras. Ambos evalúan la misma consulta que publicaste.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!