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?
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();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();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.