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

Laravel关系查询-获取所有已完成的项目,laravel,eloquent,Laravel,Eloquent,寻找一些关于创建雄辩的查询的建议 我有三张桌子 计划 任务 用户任务 项目有任务,在usertasks中,我们保存任务和用户id,以便知道它已由用户完成。现在,我需要查询用户已完成的所有项目,以便查询具有任务的项目,其中该项目的所有任务都已完成 我似乎不能把我的头绕在它周围,我正试图为它创建一个范围 public function scopeisCompleted($query) { $query = $query->whereHas('userTasks', function

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

我有三张桌子

  • 计划
  • 任务
  • 用户任务
项目有任务,在usertasks中,我们保存任务和用户id,以便知道它已由用户完成。现在,我需要查询用户已完成的所有项目,以便查询具有任务的项目,其中该项目的所有任务都已完成

我似乎不能把我的头绕在它周围,我正试图为它创建一个范围

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

    return $query;    
}
我似乎不知道如何确保该项目的所有任务都由用户完成


关于前进有什么建议吗?

我想你需要这样的建议:

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;    
}
因此,只要为
UserTask
模型设置了
task
关系,并且列是
completed
,如果不设置,则将其更改为正确的列

我只是更详细地阅读了您的问题,如果您需要检查所有任务是否已完成,那么这将有点复杂,查询需要找到有多少任务,以及该数字是否与已完成的总任务相匹配

更新

我想我现在对你要做的事情有了更多的了解:

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

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

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

稍后我需要考虑一下,我可能对您尝试执行的操作使用了错误的语法,而
with
可能需要类似于
->with('tasks.userTasks')

我想你可以在这里找到它。您需要从模型中链接您的关系,并使用用户关系调用它们。我已经为所有3个项目创建了关系,我不确定如何查询已完成所有任务的项目。我可以获取项目的所有任务,但我不确定如何为其中所有任务都由特定用户完成的项目创建一个查询。文档中是否有我应该关注的特定部分?我已经阅读了多次,但似乎无法建立连接。感谢@martincarlin87,UserTask表没有完成的列,事实上,如果UserTask表已经完成,则在UserTask表中只创建了一行。没有未完成任务的行。在你的范围内,它不会只得到那些已经完成任务的项目吗?不是所有任务都已完成的项目吗?嗯,好吧,听起来像是
whereHas
将是这里使用的最有说服力的方法,让我尝试更新答案,我只是有点困惑在哪里使用范围(哪个模型)。在项目模型中使用范围,希望最终得到$projects->isCompleted()返回当前登录用户已完成的所有项目(UserTasks)的所有任务(tasks)。我已将您的答案设置为“已完成”,因为它正在工作。它并不能单独在范围功能中完全获得已完成的项目,但至少它可以工作,感谢您的帮助。