如何在Laravel中获取近18个月未下单用户的记录?
解决近18个月无购买记录用户的查询问题
你的代码逻辑完全搞反了——当前代码是在筛选近18个月有过订单的用户,和你要的“近18个月没购买”需求正好相反。
正确实现方式
直接使用Eloquent的whereDoesntHas方法,筛选不存在近18个月订单的用户:
$eighteenMonthsAgo = Carbon::now()->subMonths(18); $modelQuery = $modelQuery->whereDoesntHave('hasOrders', function ($query) use ($eighteenMonthsAgo) { $query->whereDate('order_date', '>=', $eighteenMonthsAgo); });
另一种等价写法
也可以通过whereHas关联统计数为0的方式实现,效果和上面一致:
$eighteenMonthsAgo = Carbon::now()->subMonths(18); $modelQuery = $modelQuery->whereHas('hasOrders', function ($query) use ($eighteenMonthsAgo) { $query->whereDate('order_date', '>=', $eighteenMonthsAgo); }, '<=', 0);
逻辑说明
whereDoesntHas是Eloquent专门用于筛选“不存在指定关联条件”的模型,这里就是找没有近18个月内订单的用户。- 原代码用
whereHas会筛选出存在近18个月订单的用户,完全不符合需求,所以需要把关联存在的判断改成不存在。
内容的提问来源于stack exchange,提问作者VINA NIKAM
相关产品推荐
相关产品推荐

