我想通过嵌套关系的属性对laravel集合进行排序。
所以我查询所有项目(仅在项目有与当前用户相关的任务的地方),然后我想按任务关系的截止日期对项目进行排序。
当前代码:
Project.php
public function tasks()
{
return $this->hasMany('App\Models\ProjectTask');
}
Task.php
public function project()
{
return $this->belongsTo('App\Models\Project');
}
UserController中
$projects = Project->whereHas('tasks', function($query){
$query->where('user_id', Auth::user()->id);
})->get()->sortBy(function($project){
return $project->tasks()->orderby('deadline')->first();
});
我不知道我是否朝着正确的方向前进? 任何建议表示赞赏!
答案 0 :(得分:5)
使用.
运算符
$projects = Project::all()->load('tasks')->sortBy('tasks.deadline');
答案 1 :(得分:3)
我认为您需要使用类似join()
的内容,然后根据您的需要进行排序。
exapmle:
Project::join('tasks', 'tasks.project_id', '=', 'projects.id')
->select('projects.*', DB::raw("MAX(tasks.deadline) as deadline_date"))
->groupBy('tasks.project_id')
->orderBy('deadline_date')
->get()
<强>更新强>
Project::join('tasks', function ($join) {
$join->on('tasks.project_id', '=', 'projects.id')
->where('tasks.user_id', Auth::user()->id)
->whereNull('tasks.completed');
})
->select('projects.*', DB::raw("MAX(tasks.deadline) as deadline_date"))
->groupBy('tasks.project_id')
->orderBy('deadline_date')
->get()
<强> UPDATE2 强>
在您的查询中添加with
:
->with(['tasks' => function ($q) {
$q->where('user_id', Auth::user()->id)
->whereNull('completed');
})
答案 2 :(得分:2)
试试这个,
$tasks = Task::with('project')
->where('user_id',Auth::user()->id)
->orderBy('deadline')
->get();
之后,您可以访问以下项目属性
$tasks->first()->project()->xxx