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

如何将指定关联聚合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:33:30