首页 > 解决方案 > Laravel 关系查询 - 获取所有已完成的项目

问题描述

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

我有 3 张桌子

一个项目有任务,我们在 usertasks 中保存任务和用户 ID,这样我们就知道它已经被用户完成了。现在我需要查询用户已完成的所有项目,因此项目中包含该项目的所有任务都已完成的任务。

我似乎无法理解它,我正在尝试为此创建一个范围。

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

    return $query;    
}

我似乎无法弄清楚如何确保该项目的所有任务都由用户完成。

关于前进的任何建议?

标签: laraveleloquent

解决方案


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

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设置了关系,如果没有将其更改为正确的列。UserTaskcompleted

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

更新

我想我现在对您正在尝试做的事情有了更多的了解:

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').


推荐阅读