我使用 Oracle 作为数据库层,但问题是通过 OCI8 的 oracle(我制作了 PDO 用户空间驱动程序)仅支持 SQL 语句中的命名参数,不支持定位参数。(例如使用多个?)
从根本上说,生成 SQL 的是 Laravel 的 Eloquent,但我找不到任何关于如何覆盖参数构造的文档。
我希望能够以“: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 用户空间驱动程序,我可以将数字参数名称替换为:
//Replace the first @oci8param to a pseudo named parameter
if(is_numeric($parameter))
{
$parameter = ':autoparam'.$parameter;
}
它现在有效,我需要用 laravel 做更多测试,看看问题是否出现在不同的分数中,但到目前为止,它似乎没问题......