按关系值对集合进行排序

时间:2016-12-16 17:46:31

标签: laravel eloquent nested

我想通过嵌套关系的属性对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(); 
    });

我不知道我是否朝着正确的方向前进? 任何建议表示赞赏!

3 个答案:

答案 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