你能在Laravel Eloquent中使用命名参数吗?

时间:2013-09-06 13:33:26

标签: php sql oracle pdo laravel

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

在一个基础上,它是Laravel的Eloquent,它生成SQL,但我找不到任何关于如何覆盖参数构造的文档。

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

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

1 个答案:

答案 0 :(得分:1)

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