Laravel eloquent 加入多个 wheres

Laravel eloquent join with multiple wheres

我有 2 个模型:

一个项目有多个任务,一个任务只有一个项目。任务也有起始周、起始年、结束周和结束年,我要的是

Select all the projects and join the tasks where task startWeek = $startWeek and startYear =  $startYear and endWeek = $endWeek and endYear = $endYear

所以我想获取所有项目并加入在这几周和几年之间开始和结束的任务。

我已经尝试了一些方法,其中之一是:

        $projects = Project::join('tasks', 'tasks.project_id', '=', 'projects.id')
            ->where('tasks.start_week', '>=', $startWeek)
            ->where('tasks.start_week', '>=', $startWeek)
            ->where('tasks.end_week', '<=', $endWeek)
            ->where('tasks.end_year', '<=', $endYear)
            ->get();

但是returns

0 : {
    id:1
    name:Schmeler
    location:Harvey
    created_at:2022-04-26T21:47:55.000000Z
    updated_at:2022-04-26T21:47:55.000000Z
    project_id:3
    task_name:O'Hara
    start_week:41
    start_year:2022
    end_week:5
    end_year:2023
}

但我希望任务在数组中,例如

   id: 1,
   name: Schmeler,
   ...other items
   tasks: {
       0: {
           task_id: 1,
           task_name: Task2,
       },
       1: {
           task_id: 2,
           task_name: Task3
       }

   }

欢迎任何帮助:D

您不应为此使用联接,而应使用关系,因为默认情况下您会获得预期的结构。

class Project
{
    public function tasks()
    {
        return $this->hasMany(Task::class);
    }
}

现在您可以使用这些条件加载您的任务,以过滤关系,最简单的方法是使用 with() 包含它们并从那里查询它们。

Project::with(['tasks' => function ($query) use ($startWeek, $startYear, $endWeek, $endYear) {
    $query->where('tasks.start_week', '>=', $startWeek)
        ->where('tasks.start_week', '>=', $startYear)
        ->where('tasks.end_week', '<=', $endWeek)
        ->where('tasks.end_year', '<=', $endYear);
}])->get();

您的数据将采用您想要的结构,对于 API 用法,您只需 return 项目,它会自动转换它。

{
    $projects = Project::with(...)->get();

    return $projects;
}

对于迭代或更传统的 blade 方法,您可以像这样循环它。

foreach($project->tasks as $task)
{
    $task->task_name; // etc.
}