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

求助:将指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:17:13