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
stackswherea_certain_columnin (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
相关产品推荐
相关产品推荐

