如何将指定关联聚合SQL语句转换为Laravel Eloquent查询?
转换后的Laravel Eloquent查询方案
嘿,我来帮你把这条SQL转换成Laravel风格的Eloquent查询,两种写法供你选择:
写法一:使用模型关联
假设你已经为TAX_CHECKPOINT表创建了对应的模型(比如命名为TaxCheckpoint),可以用模型链式调用完成查询:
use App\Models\Payment; use App\Models\TaxCheckpoint; use Illuminate\Support\Facades\DB; $results = Payment::select( 'tax_checkpoint.cuocode', 'tax_checkpoint.name', DB::raw('COUNT(*) as total_payment'), DB::raw('SUM(payment.amount) as total_amount') ) ->join('tax_checkpoint', function ($join) { // 用DB::raw包裹原生正则函数,确保数据库能识别执行 $join->on('tax_checkpoint.cuocode', '=', DB::raw("REGEXP_SUBSTR(payment.invoiceid, 'R....')")); }) ->where('payment.deleted', 0) // 用Laravel自带的whereDate替代原生日期格式化,更简洁 ->whereDate('payment.txtime', '2018-04-24') ->groupBy('tax_checkpoint.cuocode', 'tax_checkpoint.name') ->orderBy('total_amount', 'desc') ->get();
写法二:使用DB门面(和原SQL表别名完全对应)
如果还没创建TaxCheckpoint模型,或者更习惯原SQL的表别名写法,可以直接用DB门面:
use Illuminate\Support\Facades\DB; $results = DB::table('tax_payment as p') ->select( 'c.cuocode', 'c.name', DB::raw('COUNT(*) as total_payment'), DB::raw('SUM(p.amount) as total_amount') ) ->join('tax_checkpoint as c', 'c.cuocode', '=', DB::raw("REGEXP_SUBSTR(p.invoiceid, 'R....')")) ->where('p.deleted', 0) ->whereDate('p.txtime', '2018-04-24') ->groupBy('c.cuocode', 'c.name') ->orderBy('total_amount', 'desc') ->get();
关键细节提醒:
- 如果你的表名不是默认的小写复数形式,记得替换成实际的表名
- 所有数据库原生函数(比如
REGEXP_SUBSTR、聚合函数)都需要用DB::raw()包裹,Eloquent才能正确解析 whereDate方法会自动处理日期格式匹配,效果和原SQL的TO_CHAR(TXTIME,'YYYY-MM-DD')完全一致
内容的提问来源于stack exchange,提问作者Phouvanh Kongchansavath
相关产品推荐
相关产品推荐

