Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

220
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda