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

求助:将PostgreSQL SQL查询转换为Laravel Eloquent

转换后的Laravel Eloquent实现

以下是和你原PostgreSQL查询逻辑完全一致的Eloquent代码:

use App\Models\Campaign;
use Illuminate\Support\Facades\DB;

$campaigns = Campaign::selectRaw('campaigns.*,
    COUNT(contacts.*) as total_calls,
    SUM(CASE WHEN contacts.client_type_oid = 1 THEN 1 ELSE 0 END) as total_potential')
    ->leftJoin('contacts', function ($join) {
        $join->on('contacts.created_at', '>=', 'campaigns.start_date')
             ->on('contacts.created_at', '<=', DB::raw('campaigns.end_date + INTERVAL \'2 day\''));
    })
    ->groupBy('campaigns.id')
    ->orderBy('campaigns.id', 'desc')
    ->get();

关键细节说明

  • selectRaw的使用:直接复用原SQL的统计逻辑,确保和原生查询的计算结果完全一致,避免Eloquent自动转换带来的偏差。
  • 动态关联条件:通过leftJoin的闭包定义关联规则,用DB::raw保留PostgreSQL的INTERVAL语法,实现结束日期加2天的范围判断。
  • 分组与排序:严格对应原SQL的GROUP BY mc.id和ORDER BY mc.id DESC逻辑,保证结果集的分组和排序规则不变。

注意事项

  • 确认Campaign模型的$table属性正确设置为campaigns,Contact模型对应contacts表。
  • 若开启Laravel数据库严格模式,PostgreSQL默认允许仅按主键分组(主键可唯一确定其他字段),若出现分组报错,可在config/database.php的pgsql配置中设置'strict' => false,或显式将campaigns表的所有字段加入groupBy(但仅按主键分组更高效)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:50:28