求助:将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
相关产品推荐
相关产品推荐

