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_idmi 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();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.
Hay documentación disponible para todas las operaciones en su consulta.
select('column1', 'column2', ...)selectRaw('sum(column) as column')WHERE column IN (...) use whereIn('column', $array)Closures o Builder ( DB::table(fn($q) => ... , alias) o DB::table($builder, alias) )UNION ALL use unionAll() con la misma sintaxis que las tablas de subconsultas. $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(); $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.