Laravel关系查询 - 获取所有已完成的项目

时间:2018-05-10 14:30:34

标签: laravel eloquent

寻找有关创建雄辩查询的一些建议。

我有3张桌子

  • 项目
  • 任务
  • UserTasks

项目有任务,在使用中我们保存任务和用户ID,因此我们知道它已由用户完成。现在我需要查询用户已完成的所有项目,因此项目中包含已完成该项目所有任务的任务。

我似乎无法绕过它,我正试图为此创建一个范围。

public function scopeisCompleted($query)
{
    $query = $query->whereHas('userTasks', function ($query) {
        $query->where('user_id', '=', Auth::user()->id);
    })->get();

    return $query;    
}

我似乎无法理解如何确保用户完成该项目的所有任务。

有关前进的建议吗?

1 个答案:

答案 0 :(得分:0)

我认为你需要这样的东西:

public function scopeisCompleted($query)
{
    $query = $query->whereHas('userTasks', function ($query) {
        $query->where('user_id', '=', Auth::user()->id)
            ->whereHas('task', function ($query) {
                $query->where('completed', 1);
            });
    })->get();

    return $query;    
}

只要为task模型设置了UserTask关系且列为completed,如果没有将其更改为正确的关系。

我只是更详细地阅读了您的问题,如果您需要检查所有任务是否已完成然后会更复杂一些,则查询需要查找有多少任务以及该数字是否与完成的总数相匹配任务。

<强>更新

我想我现在对你要做的事情了解得多一些:

public function scopeisCompleted($query)
{
    $query = $query->with('tasks', 'userTasks')->whereHas('userTasks', function ($query) {
        $query->where('user_id', '=', Auth::user()->id);
    })->get();

    return $query;    
}

如评论中所述,我不确定此范围的使用范围是什么,所以这可能仍然不正确,但在这里我添加了->with('tasks'),以便在返回查询结果后,项目的任务可以与用户完成的项目任务进行比较,尽管仍然可以在查询中而不是在PHP中执行此操作。

if (count($results->tasks)) == count($results->userTasks)) {
    // complete
}

稍后我需要考虑一下,我可能会对您尝试执行的操作采用错误的语法,with可能需要->with('tasks.userTasks')之类的内容。