fre*_*dbe 5 nested laravel eloquent
我想通过嵌套关系的属性对laravel集合进行排序.
所以我查询所有项目(仅在项目有与当前用户相关的任务的地方),然后我想按任务关系的截止日期对项目进行排序.
当前代码:
Project.php
public function tasks()
{
return $this->hasMany('App\Models\ProjectTask');
}
Run Code Online (Sandbox Code Playgroud)
Task.php
public function project()
{
return $this->belongsTo('App\Models\Project');
}
Run Code Online (Sandbox Code Playgroud)
UserController的
$projects = Project->whereHas('tasks', function($query){
$query->where('user_id', Auth::user()->id);
})->get()->sortBy(function($project){
return $project->tasks()->orderby('deadline')->first();
});
Run Code Online (Sandbox Code Playgroud)
我不知道即使是在正确的方向?任何建议表示赞赏!
这样做的一个很好的干净方法是与.
操作员
$projects = Project::all()->load('tasks')->sortBy('tasks.deadline');
Run Code Online (Sandbox Code Playgroud)
我认为你需要使用类似的东西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()
Run Code Online (Sandbox Code Playgroud)
更新
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()
Run Code Online (Sandbox Code Playgroud)
更新2
将with
您的查询添加为:
->with(['tasks' => function ($q) {
$q->where('user_id', Auth::user()->id)
->whereNull('completed');
})
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5571 次 |
最近记录: |