使用链式方法的 Laravel 复杂范围查询

Posted

技术标签:

【中文标题】使用链式方法的 Laravel 复杂范围查询【英文标题】:Laravel Complex Scope Query using chain method 【发布时间】:2021-09-03 23:59:59 【问题描述】:

我想在第二种方法中使用whereHas查询的user id。我怎样才能做到这一点?

public function scopeloadAvailableAgents($query)
    return $query->whereHas('roles', function($q)
        $q->where("name", "agent");    
    )
    ->whereNotIn('id', function($q) use (/* i want to use user_id of where has query */)
        $q->select('user_id')
            ->from(with(new UserToManager())->getTable())
            ->where('user_id', $user_id);
    )
    ->get();

编辑: memeber 是一个错字.. 它将是 agent。我在表agent_to_manager 上,我想只获取agent_to_manager 表中不存在的代理角色用户。我有两个查询,一个只获取代理角色用户,第二个检查提取的用户在哪里不存在agent_to_manager table.. 但我无法获得 whereHas 查询的结果来运行第二个查询

【问题讨论】:

嗨,@Amiyo,你能更好地说明你想要实现什么吗?也许你可以描述模型之间的关系。 如果我理解“可用代理”是所有角色的用户。名称等于成员,但 user.id 不能等于 $user_id。用户和角色之间有什么关系吗? @ViníciusFagundes 抱歉 member 是一个错字.. 将有两个查询.. 一个将获取角色为 agent 的用户,然后第二个查询将检查 ids 是否存在agent_to_managers表.. 好的!但是,请多描述一下当前模型(具有此范围方法),它的用户模型?和 UserToManager 模型,你能描述得更好吗?我猜 UserToManager 属于用户,而用户有一个 UserToManager。如果是这样,答案可能很简单。 换句话说,您基本上想要返回所有available agents,这意味着所有具有agent 角色但当前不在agent_to_manager 中的用户。但我现在需要了解具有作用域函数的模型和 UserToManager 模型之间的关系。 【参考方案1】:
  public function scopeloadAvailableAgents($query, $managerId)

        return $query->whereNotIn('id', function($q) use ($managerId)
            $q->select('user_id')
            ->from(with(new UserToManager())->getTable())
            ->where('manager_id', $managerId);
        )
        ->whereHas('roles', function($q)
            $q->where("name", "agent");
            
        )->get();
        
    

【讨论】:

以上是关于使用链式方法的 Laravel 复杂范围查询的主要内容,如果未能解决你的问题,请参考以下文章

2/1 最短路径和链式前向星的结合应用

在laravel封装一套自己的链式操作

在 Mockery 中测试链式方法调用

数据库-链式查询

如何将链式作业分派到 Lumen 6 中的队列?

jQuery 链式写法