【问题标题】:Laravel relationship query - get all completed projectsLaravel 关系查询 - 获取所有已完成的项目
【发布时间】:2018-05-10 14:30:33
【问题描述】:

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

我有 3 张桌子

  • 项目
  • 任务
  • 用户任务

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

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

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

    return $query;    
}

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

对前进有什么建议吗?

【问题讨论】:

  • 我想你可以在这里找到它。您需要将您的关系与模型联系起来,然后将它们与用户的关系调用。 laravel.com/docs/5.6/eloquent-relationships
  • 我已经为所有 3 个创建了关系,我不确定如何查询已完成所有任务的项目。我可以获得项目的所有任务,但是我不确定如何为其中所有任务都由特定用户完成的项目创建一个查询。我应该关注该文档中的特定部分吗?我已经阅读了很多遍,但似乎无法建立联系。

标签: laravel eloquent


【解决方案1】:

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

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;    
}

正如评论中提到的,我不确定这个范围正在使用什么模型,所以这可能仍然不正确,但在这里我添加了->with('tasks'),以便在返回查询结果后,项目的任务可以与用户为项目完成的任务进行比较,尽管在查询中而不是在 PHP 中应该仍然可以做到这一点。

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

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

【讨论】:

  • 感谢@martincarlin87,UserTask 表没有已完成的列,实际上如果已完成,UserTask 表中只会创建一行。未完成的任务没有行。并且以您的范围,它不会只获取已完成任务的项目吗?不是已完成所有任务的项目?
  • 嗯,好的,听起来whereHas 将是在这里使用的正确 Eloquent 方法,让我尝试更新答案,我只是有点困惑使用范围的位置(哪个型号)。
  • 范围正在项目模型中使用,希望以 $projects->isCompleted() 结束,它返回当前登录用户已完成的所有项目(UserTasks)所有任务(Tasks) .
  • 我已将您的答案设置为已完成,因为它正在工作。仅在范围功能中并不能完全获得已完成的项目,但至少它正在工作,感谢您的帮助。
猜你喜欢
  • 2014-11-13
  • 2017-01-26
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 2017-09-05
相关资源
最近更新 更多