很奇怪的一个赋值问题
public function index_data(Request $request) {
$user = $request->user();
switch($request->type) {
case 'today' :
$date = today();
$query = OrderItem::where('merchant_id', $user->user_merchant->id)->whereDate('created_at', $date);
break;
.
.
.
}
$res['order_count'] = $query->count();
$res['sell_amount_count'] = $query->sum('item_real_price');
$res['use_count'] = $query->where('use_status', 5)->count();
$res['use_amount_count'] = $query->where('use_status', 5)->sum('item_real_price');
$res['refund_count'] = $query->where('item_refund_status', 'success')->count();
$res['refund_amount_count'] = $query->where('item_refund_status', 'success')->sum('item_real_price');
if($res) {
return response()->json(['res' => $res],201);
} else {
return response()->json(['res' => 'none'],201);
}
}
$res['refund_count']
和$res['refund_amount_count']
应该分别是 1 和 3.00 ,但是实际结果都是0
但是,如果我要是把下面这两行删除了,就正常了
$res['use_count'] = $query->where('use_status', 5)->count();
$res['use_amount_count'] = $query->where('use_status', 5)->sum('item_real_price');
或者,我修改一下,直接写成:
$res['refund_count'] = OrderItem::where('merchant_id', $user->user_merchant->id)->whereDate('created_at', $date)->where('item_refund_status', 'success')->count();
$res['refund_amount_count'] = OrderItem::where('merchant_id', $user->user_merchant->id)->whereDate('created_at', $date)->where('item_refund_status', 'success')->sum('item_real_price');
这是什么情况,不应该会覆盖吧
这并不奇怪,而且是完全符合预期的。
这属于对象的可变性,当你每次调用 where 方法的时候,就会往 Builder 对象上的 where 属性添加一条记录,来记录你的 where 条件。
每个 where 都是返回的当前的 Builder 对象(
$this
),所以当你后面的 where 条件,也会影响到你前面保存的$query
,因为他们本就是指向的同一个对象,这也就是对象的可变性。如果你想要达到你期待的效果,那你可以使用 clone 语法克隆当前的 Builder,或者调用 Builder 上面的 clone 方法。
基于这个特性,在大多数情况下,以下的代码是可以被简化的,你不必将操作的返回值再赋值给
$query
,因为他始终都是那一个对象补充一下吧
把其他的代码去掉后,查询的时候 Builder 大致就是这个样子。
因为他们自始至终都是操作的一个对象。