Laravel eloquent 具有多个内连接

Kra*_*ray 10 php laravel eloquent

我目前正在执行原始 SQL 查询,但这会导致关系和模型启动方法出现问题。

是否可以使用 laravel eloquent 模型按关系执行以下 SQL 查询?请注意,所有数据库表都定义了 FK,并且关系为 HasOne 或 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`"
    );
Run Code Online (Sandbox Code Playgroud)

型号有

Entries
Tasks
Class
Subclass
Run Code Online (Sandbox Code Playgroud)

我必须如何构建模型关系来处理上述 sql 查询?

在此输入图像描述

Cal*_*vin 1

模型\Entries.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

模型\Tasks.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");
    }
}
Run Code Online (Sandbox Code Playgroud)

模型\类.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");
    }
}
Run Code Online (Sandbox Code Playgroud)

模型\子类.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");
        
    }
}
Run Code Online (Sandbox Code Playgroud)

询问:

Entries::with([
        "Tasks",
        "Classes",
        "SubClasses"
    ])
    ->where("opportunity_id", $opportunity->id)
    ->groupBy("task_id")
    ->get();
Run Code Online (Sandbox Code Playgroud)