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

Laravel查询构造器中如何查看toSql()里?占位符绑定的实际内容?

Laravel查询构造器查看占位符绑定参数的方法

toSql()返回带?占位符的SQL是框架的预处理保护机制,默认不会直接把参数拼接在SQL语句中,要查看实际绑定的参数可以用以下几种方式:

  • 直接获取完整原生SQL(推荐)
    Laravel 5.8及以上版本的查询构造器自带toRawSql()方法,会直接返回所有占位符替换为实际参数后的完整可执行SQL,不需要手动拼接:

    $listArray = [1, 2, 3];
    // 注意:要查询字段值在数组范围内的场景,需要用whereIn,直接传数组给where默认生成=等值条件,会出现类型匹配错误
    $fullSql = Stack::whereIn('a_certain_column', $listArray)->toRawSql();
    

    输出结果示例:

    select * from stacks where a_certain_column in (1, 2, 3)

  • 分别获取SQL模板和绑定参数
    如果是低于5.8的Laravel版本,可以调用getBindings()方法拿到按占位符顺序排列的绑定参数数组,和toSql()返回的SQL模板一一对应:

    $query = Stack::whereIn('a_certain_column', $listArray);
    $sqlWithPlaceholder = $query->toSql(); // 带?占位符的SQL模板
    $bindings = $query->getBindings(); // 绑定参数数组,此处返回值就是[1,2,3]
    

    拿到两个结果后,自行遍历替换?占位符就能得到完整SQL。

  • 通过查询日志查看执行记录
    可以开启框架的数据库查询日志,执行查询后直接拿到包含绑定参数的完整执行记录:

    // 开启查询日志
    \DB::enableQueryLog();
    // 执行目标查询
    Stack::whereIn('a_certain_column', $listArray)->get();
    // 获取所有执行过的SQL记录
    $queryLogs = \DB::getQueryLog();
    

    日志的每条记录都会包含query(SQL模板)、bindings(绑定参数数组)、time(执行耗时)三个字段,可直接核对参数绑定情况。

补充说明:你示例代码里直接把数组传入where()第二个参数的写法有误,这种写法框架默认生成的是a_certain_column = ?的等值查询,不会自动转为IN条件,实际执行时会出现参数类型不匹配的问题,数组范围查询请使用whereIn()方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:51:19