You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Eloquent查询无完成交易用户的全部失败交易?

解决Eloquent查询获取符合条件的失败交易问题

我懂你的痛点——你现在需要的是直接拿到所有符合要求的失败交易记录,而不是对应的用户列表对吧?其实只需要把查询的出发点从User模型切换到Transaction模型,再加上关联条件就能搞定了。

方案一:基于关联关系的查询

直接从交易表入手,筛选出失败交易,同时确保这些交易所属的用户从未有过完成状态的交易:

$failedTransactions = Transaction::where('status', 'failed')
    ->whereHas('user', function ($query) {
        // 确保该用户没有任何完成状态的交易
        $query->whereDoesntHave('transactions', function ($subQuery) {
            $subQuery->where('status', 'completed');
        });
    })
    ->get();

这个逻辑很清晰:

  1. 先过滤出所有status为failed的交易
  2. 再通过whereHas限制这些交易的所属用户不存在任何完成状态的交易,完美匹配你定义的「问题交易」场景。

方案二:子查询优化(适合大数据量场景)

如果你的交易数据量比较大,用子查询先找出符合条件的用户ID,再筛选对应交易可能会更高效:

$failedTransactions = Transaction::where('status', 'failed')
    ->whereIn('user_id', function ($query) {
        $query->select('user_id')
            ->from('transactions')
            ->groupBy('user_id')
            // 统计用户的完成交易数,确保为0
            ->havingRaw('SUM(CASE WHEN status = "completed" THEN 1 ELSE 0 END) = 0');
    })
    ->get();

这种方式先通过分组统计,找出所有没有完成交易的用户ID集合,再用这个集合去筛选失败交易,避免了多层关联的嵌套查询,性能上可能更优。

对比你原来的查询,只是把查询主体从用户换成了交易,再通过关联条件锁定符合要求的用户,就能直接得到你需要的交易列表啦~

内容的提问来源于stack exchange,提问作者frostfat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:14:05