larval执行原生sql进行in查询踩的坑(其实是使用PDO踩的坑)
由于业务变更,需要在larval项目中执行几个类似的update语句:
update 表名 set name = CONCAT(?,`name`) where id in(?),
因此需要写原生sql执行。虽然每次都执行成功,没有报错,并且日志打印的sql拼接也正确,但是实际数据库的变更结果却不正确,只有一条数据发生变更,其余数据都未改变。下面就使用select语句,来模拟定位具体原因。
错误使用方式:从下图可以看出,使用代码执行最后得到一个id。但是执行日志中的sql最后会的得到3个id。
代码:
日志:
数据库执行:
postman执行:
所以in()查询这么绑定肯定是有问题, 于是就代码一层一层的往底层追下去,发现有这么一段代码,在绑定参数时对值的类型进行了判断,所以上面代码绑定的第二个参数被视作了一个字符串。
那么in()查询需要怎么写呢?下面对例子中的代码进行了修正,代码执行和数据库执行sql,最终都得到了3个id。
代码: .
日志:
数据库执行:
postman执行: