求助:将指定SQL查询转换为Laravel Eloquent模型或原生查询
嘿,我来帮你搞定这个SQL转Laravel查询的问题!先拆解下原SQL的核心逻辑:从active_call_statuses表左关联active_calls(关联条件是active_calls.parent_call_id = active_call_statuses.active_call_id),筛选状态在指定列表里的记录,同时给每条结果附一个统计特定呼叫ID总记录数的total字段。下面给你两种实现方案:
1. 使用Eloquent模型查询
首先假设你已经创建了对应的Eloquent模型(比如ActiveCallStatus和ActiveCall),如果还没定义关联,可以先在ActiveCallStatus模型里加个关联方法:
// app/Models/ActiveCallStatus.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class ActiveCallStatus extends Model { protected $table = 'active_call_statuses'; public function activeCall() { return $this->belongsTo(ActiveCall::class, 'active_call_id', 'parent_call_id'); } }
然后就可以用Eloquent构建查询了:
// 目标呼叫ID $targetCallId = 'CA3a77245ab0eac10f8cf3aa8e7c8f9a91'; $results = ActiveCallStatus::query() ->select([ 'status', // 用DB::raw处理子查询,绑定参数避免SQL注入 \DB::raw('(SELECT count(*) FROM active_call_statuses WHERE active_call_id = ?) AS total', [$targetCallId]) ]) ->leftJoin('active_calls', 'active_calls.parent_call_id', '=', 'active_call_statuses.active_call_id') ->whereIn('status', ['in-progress', 'completed', 'ringing', 'answered', 'busy', 'failed', 'no-answer']) ->get();
2. 使用原生数据库查询
如果更习惯直接写原生SQL,Laravel的DB门面也支持,记得绑定参数保证安全:
$targetCallId = 'CA3a77245ab0eac10f8cf3aa8e7c8f9a91'; $statusList = ['in-progress', 'completed', 'ringing', 'answered', 'busy', 'failed', 'no-answer']; // 动态生成status的占位符,适配数组长度变化 $statusPlaceholders = implode(', ', array_fill(0, count($statusList), '?')); $results = \DB::select(" SELECT status, (SELECT count(*) FROM active_call_statuses WHERE active_call_id = ?) AS total FROM active_call_statuses LEFT JOIN active_calls ON active_calls.parent_call_id = active_call_statuses.active_call_id WHERE status IN ($statusPlaceholders) ", array_merge([$targetCallId], $statusList));
小提示
- 两种方式都用了参数绑定,避免硬编码值导致的SQL注入风险,这是Laravel里的最佳实践哦。
- 如果你的查询还有后续条件(比如原SQL里的
...部分),直接在Eloquent的链式调用里加->where()等方法,或者在原生SQL里补充即可。
内容的提问来源于stack exchange,提问作者Wouter Van Hees
相关产品推荐
相关产品推荐

