我将Oracle用作数据库层,但是问题是通过OCI8(我做了一个PDO用户空间驱动程序)的oracle仅支持SQL语句中的命名参数,不支持定位的参数。(例如使用多个?)
从根本上讲,是Laravel的Eloquent生成了SQL,但是我找不到任何有关如何重写参数构造的文档。
我希望能够以“:name”的形式创建命名参数,而不是放置多个“?” 整个查询。
能做到吗?我的猜测是它与数据库语法类有关…
哦,好吧,如果有人有更好的解决方案,请继续提交它,或者告诉我我的临时解决方案有什么问题。我替换所有的“?” 用“:autoparam”和参数增量创建“:autoparam0”,“:autoparam1”,“:autoparam2”等。
//Replace ? with a pseudo named parameter $newStatement = null; $parameter = 0; while($newStatement !== $statement) { if($newStatement !== null) { $statement = $newStatement; } $newStatement = preg_replace('/\?/', ':autoparam'.$parameter, $statement, 1); $parameter++; } $statement = $newStatement;
然后,当我收到来自PDO的绑定参数的请求时,我会检查该参数是否为数字。据我所知,在大多数语言中,数字索引是无效的标识符,因此,至少对于我的PDO Userspace驱动程序,我可以放心地假设我可以将数字参数名称替换为:
//Replace the first @oci8param to a pseudo named parameter if(is_numeric($parameter)) { $parameter = ':autoparam'.$parameter; }
它现在可以使用,我需要对laravel进行更多测试,以查看问题是否以不同的分数出现,但是到目前为止,看来还可以…