为何Laravel MongoDB查询实例会被修改?如何恢复初始查询?
Laravel MongoDB 查询对象被修改的原因及恢复方法
这事儿我太清楚了!Laravel的查询构建器(包括你用的这个laravel-mongodb扩展实现的版本)本质是可变对象——也就是说,你每次调用where()、orderBy()这类查询方法时,都是直接在原有的$query对象上做修改,而不是返回一个全新的查询实例。所以当你执行$query->where('title','like',"%$request->search%")这行代码时,原来的$query已经被永久修改了,这就是两次toSql()输出结果不一样的核心原因。
想要恢复到初始查询状态,或者避免修改原查询对象,有两种常用的优雅方式:
1. 使用clone关键字复制初始查询对象
初始化基础查询后,克隆一份新的实例来做后续的条件修改,这样原查询对象会保持初始状态不变:
// 先定义好基础的初始查询 $baseQuery = $this->proposal->where('status', 'approved') ->with(['evaluations', 'user', 'contributions']) ->with(['reviews' => function ($q) { $q->where('status','approved')->orderBy('created_at', 'desc'); }]); if( .... ) { dd($baseQuery->toSql()); // 输出初始的select语句 // 克隆基础查询,用新实例添加过滤条件 $filteredQuery = clone $baseQuery; $proposalsFoundByTile = $filteredQuery->where('title','like',"%$request->search%")->get(); dd($baseQuery->toSql()); // 依然是初始的select语句,不受影响 ... }
2. 重新构建初始查询(不推荐,重复代码多)
如果不想用克隆,也可以在需要的时候重新执行一遍初始查询的构建代码,但这种方式会产生重复代码,维护性差,一般只在简单场景下用。
内容的提问来源于stack exchange,提问作者Denys Siebov
相关产品推荐
相关产品推荐

