我在拉威尔关于聚合关系的文档中找不到这一点

我能够做这样的事情

    private function refreshUsers()
    {
        $this->users = User::withSum(['taskTimeSessions'=> function ($query) {
                                    $query->whereMonth('created_at',$this->month)
                                            ->where('is_reconciled',1);
                        }],'session_duration_in_seconds')
                        ->get();
    }

但现在我想问的是Sprint米的总时间是多少,或者至少一次冲刺中的各个任务有多少时间,这样我就可以以某种方式将这些时间加起来.

  • Sprint有很多Sprint任务(数据透视表)
  • Sprint任务属于一个任务
  • 任务具有多个TaskTimeSession

因此,我正在try 查找TaskTimeSession的总时间

Sprint::with([
'sprintTasks.task'=> function ($query) {
    $query->withSum('taskTimeSessions','session_duration_in_seconds');
   }])
->get();

我没有收到任何错误,但在dd的任何位置都找不到结果

我以为我会走运,能有这样的工作

->withSum('sprintTasks.task.taskTimeSessions', 'session_duration_in_seconds')

但我得到了这个错误

Call to undefined method App\Models\Sprint::sprintTasks.task()

如果有人能帮我解决这个问题,即使不包括Sum,也将不胜感激.

按要求,这些都是模型.

// Sprint
public function sprintTasks()
    {
        return $this->hasMany(SprintTask::class, 'sprint_id');
    }
    


// SprintTask
protected $fillable = [
        'sprint_id',
        'task_id',
        'is_completed'
    ];

public function task()
    {
        return $this->belongsTo(Task::class,'task_id');
    }

public function sprint()
    {
        return $this->belongsTo(Task::class,'sprint_id');
    }



// Task
public function taskTimeSessions()
    {
        return $this->hasMany(TaskTimeSession::class, 'task_id');
    }



// TaskTimeSessions
protected $fillable = [
        'task_id',
        'session_duration_in_seconds'
    ];
    

public function task()
    {
        return $this->belongsTo(Task::class,'task_id');
    }

是否可以将其抽象为模型,如下所示

public function totalTaskTime() {
 // using the relationship stuff to figure out the math and return it? 

}

寻求任何关于如何做这件事的最好方法的建议.

现在我真的在刀锋上做这件事,看起来很糟糕

@php
    $timeTracked = 0;
    
    foreach ($sprint->sprintTasks as $sprintTask) {
        $timeTracked += $sprintTask->task->time_tracked_in_seconds;
    }
@endphp

推荐答案

Sprint和TASK之间存在多对多的关系

为此,您可以使用sprint_tasks作为透视表设置直接关系belongsToMany

// Sprint
public function sprintTasks()
{
    return $this->hasMany(SprintTask::class, 'sprint_id');
}

public function tasks()
{
    return $this->belongsToMany(Task::class, 'sprint_tasks', 'sprint_id', 'task_id')->withPivot('is_completed');
}

现在您可以使用该关系来查询您的需求

Sprint::with(['tasks'=> function ($query) {
    $query->withSum('taskTimeSessions','session_duration_in_seconds');
}])
->get();

Php相关问答推荐

如何在数据库中添加注册表单中的动态新行?

从WooCommerce Checkout Country Select2下拉列表中重新排序国家/地区

Laravel:从匹配的数组数据中获取记录

以编程方式更改新订单、已取消订单和失败订单的邮箱WooCommerce通知

WooCommerce-在选定类别中每消费X个金额即可添加免费礼物

使注册字段UserMeta值对于WooCommerce中的每个用户是唯一的

如何在laravel中使用script type= text/html/script

PHP:使用FORT从数据库获取USERS表到AUTH表

使用DOMPDF获取PDF格式的本 map 像

在 WooCommerce 订阅续订订单中设置送货方式

有没有办法像引用枚举一样引用注册表中的对象?

当未 Select 任何变体时,在 WooCommerce 可变产品上显示自定义文本

API 平台 - UI 服务器端点定义

AWS S3:当对象名称包含 % 时复制对象失败并出现错误 - 无效的复制源编码

MongoDB Laravel Jenssegers 包:插入数据库时​​未定义的类常量PRIMARY

如何获取用户之间的最新消息列表

如何将子查询结果添加到学说 2 中主查询的末尾?

mysql / sql修复多对多数据库中的行

我想更新表格中的结果并将它们发布到浏览器,但它不起作用

使用 PHP 有条件地使用关键字 Twilio Programmable SMS