3

我使用 Oracle 作为数据库层,但问题是通过 OCI8 的 oracle(我制作了 PDO 用户空间驱动程序)仅支持 SQL 语句中的命名参数,不支持定位参数。(例如使用多个?)

从根本上说,生成 SQL 的是 Laravel 的 Eloquent,但我找不到任何关于如何覆盖参数构造的文档。

我希望能够以“:name”的形式创建命名参数,而不是放置大量的“?” 在整个查询中。

这可以做到吗?我的猜测是它与数据库语法类有关......

4

1 回答 1

0

哦,好吧,如果有人有更好的解决方案,请继续提交,或者告诉我我的临时解决方案可能有什么问题。我替换所有“?” 使用 ":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 做更多测试,看看问题是否出现在不同的分数中,但到目前为止,它似乎没问题......

于 2013-09-06T14:10:33.383 回答