Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

221
Vistas
Laravel elocuente con múltiples uniones internas

Actualmente estoy haciendo una consulta sql sin procesar, sin embargo, esto está causando problemas con las relaciones y los métodos de arranque del modelo.

¿Es posible hacer la siguiente consulta SQL pero con modelos elocuentes de laravel por relación? Tenga en cuenta que todas las tablas de db tienen FK definidos y relaciones HasOne o HasMany.

 $timeBreakDown = DB::select( "SELECT Entries.`task_id`, Entries.`opportunity_id`, SUM(Entries.`total_duration`) as 'duration', Class.`class` as 'class', Subclass.`sub_class` as 'subclass' from entries Entries INNER JOIN `tasks` Task ON task_id = Task.id INNER JOIN `task_class` Class ON Task.`class_id` = Class.`id` INNER JOIN `task_subclasses` Subclass ON Task.`subclass_id` = Subclass.`id` WHERE Entries.`opportunity_id` = '".$opportunity->id."' GROUP BY Entries.`task_id`" );

Los modelos son

 Entries Tasks Class Subclass

¿Cómo tendría que estructurar las relaciones de mis modelos para manejar la consulta sql anterior?

ingrese la descripción de la imagen aquí

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Puede escribir una consulta de esta manera:
Verifique los nombres de las tablas de acuerdo con su base de datos

 DB:: table('table name')->join('tasks','task_id','=','tasks.id') ->join('task_class', 'tasks.subclass_id','=','task_class.id') ->join('task_subclasses','tasks.subclass_id','=', 'task_subclasses.id') ->selectRaw('entries.task_id, task_subclasses.opportunity_id, SUM(entries.total_duration) as duration, task_class.class as class, task_subclasses.sub_class as subclass') ->where(['entries.opportunity_id'=>$opportunity->id]) ->groupBy('enteries.task_id')->get();
over 4 years ago · Santiago Trujillo Denunciar

0

Modelos\Entradas.php

 <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Entries extends Model { public function Tasks(){ return $this->hasOne(Tasks::class); } public function Class(){ return $this->hasMany(Classes::class); } public function SubClasses(){ return $this->hasOne(SubClasses::class); } }

Modelos\Tareas.php

 <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Tasks extends Model { public function Entries(){ return $this->belongsTo(Entries::class, "id", "task_id"); } }

Modelos\Clases.php

 <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Classes extends Model { public function Entries(){ return $this->belongsTo(Entries::class, "class_id", "id"); } }

Modelos\Subclases.php

 <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class SubClasses extends Model { public function Entries(){ return $this->belongsTo(Entries::class, "id", "subclass_id"); } }

Consulta:

 Entries::with([ "Tasks", "Classes", "SubClasses" ]) ->where("opportunity_id", $opportunity->id) ->groupBy("task_id") ->get();
over 4 years ago · Santiago Trujillo Denunciar

0

Si hubiera publicado sus modelos, habría sido más fácil para nosotros. Pero esto es lo que obtuve de su consulta sin procesar anterior.

 $timeBreakDown = Entries::where('opportunity_id',$opportunity->id)->load('Tasks','Class.SubClass')->get();

Deberías leer sobre Laravel Eloquent y las relaciones. Solo para una breve introducción, la diferencia entre load y with utilizada por Waleed es: Load se usa para la carga diferida de datos de relación, mientras que with se usa para la carga ansiosa.

La carga ansiosa son todos los datos que se cargan tan pronto como Eloquent consulta los datos, mientras que la carga diferida carga los datos cuando es necesario.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda