一尘不染

您可以在Laravel Eloquent中使用命名参数吗

sql

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

从根本上讲,是Laravel的Eloquent生成了SQL,但是我找不到任何有关如何重写参数构造的文档。

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

能做到吗?我的猜测是它与数据库语法类有关…


阅读 292

收藏
2021-03-08

共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
Userspace驱动程序,我可以放心地假设我可以将数字参数名称替换为:

    //Replace the first @oci8param to a pseudo named parameter
    if(is_numeric($parameter))
    {
        $parameter = ':autoparam'.$parameter;
    }

它现在可以使用,我需要对laravel进行更多测试,以查看问题是否以不同的分数出现,但是到目前为止,看来还可以…

2021-03-08