按关系值对集合进行排序
Sort collection by relationship value
我想按嵌套关系的属性对 laravel 集合进行排序。
所以我查询了所有的项目(只有项目有与当前用户相关的任务),然后我想按任务关系的截止日期对项目进行排序。
当前代码:
Project.php
public function tasks()
{
return $this->hasMany('App\Models\ProjectTask');
}
Task.php
public function project()
{
return $this->belongsTo('App\Models\Project');
}
用户控制器
$projects = Project->whereHas('tasks', function($query){
$query->where('user_id', Auth::user()->id);
})->get()->sortBy(function($project){
return $project->tasks()->orderby('deadline')->first();
});
我不知道我的方向是否正确?
任何建议表示赞赏!
我认为您需要使用 join()
之类的东西,然后根据需要进行排序。
例如:
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()
更新2
在您的查询中添加 with
作为:
->with(['tasks' => function ($q) {
$q->where('user_id', Auth::user()->id)
->whereNull('completed');
})
试试这个,
$tasks = Task::with('project')
->where('user_id',Auth::user()->id)
->orderBy('deadline')
->get();
之后您可以像下面那样访问项目属性
$tasks->first()->project()->xxx
一个干净利落的方法是使用 .
运算符
$projects = Project::all()->load('tasks')->sortBy('tasks.deadline');
我想按嵌套关系的属性对 laravel 集合进行排序。
所以我查询了所有的项目(只有项目有与当前用户相关的任务),然后我想按任务关系的截止日期对项目进行排序。
当前代码:
Project.php
public function tasks()
{
return $this->hasMany('App\Models\ProjectTask');
}
Task.php
public function project()
{
return $this->belongsTo('App\Models\Project');
}
用户控制器
$projects = Project->whereHas('tasks', function($query){
$query->where('user_id', Auth::user()->id);
})->get()->sortBy(function($project){
return $project->tasks()->orderby('deadline')->first();
});
我不知道我的方向是否正确? 任何建议表示赞赏!
我认为您需要使用 join()
之类的东西,然后根据需要进行排序。
例如:
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()
更新2
在您的查询中添加 with
作为:
->with(['tasks' => function ($q) {
$q->where('user_id', Auth::user()->id)
->whereNull('completed');
})
试试这个,
$tasks = Task::with('project')
->where('user_id',Auth::user()->id)
->orderBy('deadline')
->get();
之后您可以像下面那样访问项目属性
$tasks->first()->project()->xxx
一个干净利落的方法是使用 .
运算符
$projects = Project::all()->load('tasks')->sortBy('tasks.deadline');