Laravel查询构造器中findWhere()函数的作用及使用疑问
Laravel 项目中
findWhere()方法的作用与代码逻辑解析 方法本质说明
findWhere() 不是Laravel Eloquent原生提供的内置方法,是项目开发中非常常见的自定义封装方法,来源通常有两种:
- 仓库(Repository)模式架构下,在抽象基类中统一实现的快捷查询方法
- 模型类内部自定义的辅助查询方法
这类封装的通用实现逻辑为:接收一个「查询字段=>匹配值」格式的等值条件数组,内部自动遍历数组转换为链式where()查询条件,最后返回查询结果集。它和原生where()的查询能力完全等价,只是做了语法简化:
- 原生
where()支持复杂运算符、闭包分组、单条件链式拼接,灵活性更高 findWhere()仅适用于单值等值匹配场景,可以一次性传入多个等值条件完成查询,书写更简洁
当前业务代码的调用逻辑拆解
这段代码中的findWhere()调用,对应的完全等价的原生查询语句为:
->where('assign_to_id', $request->input('user_id'))->get()
整个getInfluencerCampaign方法的完整执行链路为:
- 基于当前模型实例,配置全链路嵌套关联的预加载规则:
- 第一层预加载
invite关联,加载时继续嵌套预加载该关联下的campaign子关联 - 对
campaign关联做字段裁剪,仅查询id、name、slug、objective_id4个字段,同时继续预加载3个嵌套子关联:- 关联的付款记录,连带预加载付款类型的ID、名称字段
- 关联的项目目标,连带预加载目标的ID、名称、slug字段
- 匹配当前达人用户ID的账号统计数据,仅查询工作率、评分、互动率、互动量、粉丝量等核心指标字段
- 第一层预加载
- 预加载规则配置完成后,通过
findWhere()对主表数据做等值过滤:仅查询主表中assign_to_id字段值等于当前请求传入的达人用户ID的所有记录 - 拿到过滤后的完整记录集后,调用集合的
groupBy()方法,按照campaign_invite_id字段对结果做分组,最终返回分组后的集合数据
补充提示
从代码后续链式调用groupBy()的逻辑可以判断,当前项目内的findWhere()返回的是完整的Eloquent集合,和直接调用get()方法拿到的结果无差异,没有额外的分页、字段截断等自定义逻辑。
内容的提问来源于stack exchange,提问作者syedIkrar
相关产品推荐
相关产品推荐

