如何使用Laravel ORM在指定多级会计科目区间查询交易明细?
实现会计科目组合区间查询
针对需求,需基于cta、scta、sscta三个字段的组合值进行区间筛选,目标是找出**(cta, scta, sscta) >= (102, 1, 2)** 且 (cta, scta, sscta) <= (105, 2, 0) 的记录,以下是两种可行实现方式:
方案一:原生SQL条件(Laravel whereRaw)
利用主流数据库对多列组合比较的支持(如MySQL 5.7+、PostgreSQL),直接通过原生SQL逻辑实现,代码简洁高效:
$transaction_details = TransactionDetails::whereRaw("(cta, scta, sscta) >= (102, 1, 2)") ->whereRaw("(cta, scta, sscta) <= (105, 2, 0)") ->get();
方案二:Laravel查询构造器链式拼接
若需避免原生SQL,可拆解组合条件为多个逻辑分支,完全通过框架语法实现:
$transaction_details = TransactionDetails::where(function ($query) { // 1. cta在103-104之间的所有记录 $query->whereBetween('cta', [103, 104]) // 2. cta=102时,筛选scta>1 或 scta=1且sscta>=2的记录 ->orWhere(function ($sub) { $sub->where('cta', 102) ->where(function ($sub2) { $sub2->where('scta', '>', 1) ->orWhere(function ($sub3) { $sub3->where('scta', 1) ->where('sscta', '>=', 2); }); }); }) // 3. cta=105时,筛选scta<2 或 scta=2且sscta<=0的记录 ->orWhere(function ($sub) { $sub->where('cta', 105) ->where(function ($sub2) { $sub2->where('scta', '<', 2) ->orWhere(function ($sub3) { $sub3->where('scta', 2) ->where('sscta', '<=', 0); }); }); }); }) ->get();
验证结果
执行任一代码后,将得到期望的查询结果:
cta scta sscta charge 102 1 2 20.00 102 1 2 2.00 105 1 0 30.00 105 2 0 50.00
内容的提问来源于stack exchange,提问作者Jorch Cab
相关产品推荐
相关产品推荐

