gpt4 book ai didi

php - laravel eloquent 中深度嵌套关系中的 withSum

转载 作者:行者123 更新时间:2023-12-03 08:00:41 29 4
gpt4 key购买 nike

我在 laravel 文档中找不到关于聚合关系的内容

我能够做这样的事情

    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 有许多 SprintTask(数据透视表)
  • SprintTask 属于一个 Task
  • 任务有多个 TaskTimeSession

所以我试图找到 TaskTimeSessions 的总时间

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()

如果有人可以帮助我提供一些有关如何解决此问题的指导,即使它不包括 withSum,我也会非常感激。

根据要求,这些是模型。

// 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?

}

寻求有关最佳方法的建议。

现在我确实在 Blade 上这样做,看起来很糟糕

@php
$timeTracked = 0;

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

最佳答案

Laravel 有一个很好的包来处理复杂的关系 - eloquent-has-many-deep 。您可以使用它通过无限数量的表建立关系。

composer require staudenmeir/eloquent-has-many-deep:"^1.7"

Sprint.php

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Staudenmeir\EloquentHasManyDeep\HasManyDeep;
use Staudenmeir\EloquentHasManyDeep\HasRelationships;

class Sprint extends Model
{
use HasRelationships;

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

public function taskTimeSessions(): HasManyDeep
{
return $this->hasManyDeepFromRelations($this->tasks(), (new Task())->taskTimeSessions());
}
}

任务.php

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Task extends Model
{
use HasFactory;

public function taskTimeSessions(): HasMany
{
return $this->hasMany(TaskTimeSession::class);
}
}

结果:

$sprints = Sprint::withSum('taskTimeSessions', 'session_duration_in_seconds')->get();

关于php - laravel eloquent 中深度嵌套关系中的 withSum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74319049/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com