无效的Oracle表名:User,使用Laravel

时间:2014-04-18 11:51:39

标签: php laravel oracle11g eloquent

我正在尝试将我的一个Laravel项目迁移到Oracle数据库(11g)。我安装了this package来与数据库通信。一切似乎都在工作如果我编写查询,但自动查询构建器会进行无效查询。喜欢: 注册使用此验证发布:

$validator = Validator::make(Input::all(),array(
            'createInputEmail'          => 'required|email|unique:User,email|max:254',
            'createInputDisplayName'    => 'max:24|min:4|alpha_num',
            'createInputPassword1'      => 'required|max:60',
            'createInputPassword2'      => 'required|same:createInputPassword1'
        ));

这里的问题是独特的检查。我收到这个错误:

oci_execute(): ORA-00903: invalid table name (SQL: select count(*) as aggregate from User where email = asd@asd.sd) 

如果我将此查询复制到SQL Developer以测试并将引号应用于表名,则它可以正常工作。 所以正确的查询:

select count(*) as aggregate from "User" where email = asd@asd.sd;

//不要担心不带引号的电子邮件地址

我在定义验证器时无法对规则加引号,因为它会被转义。

我试过了:

'required|email|unique:\'User\',email|max:254',
'required|email|unique:\"User\",email|max:254',
'required|email|unique:"User",email|max:254',
'required|email|unique:""User"",email|max:254', <-- the first 2 got escaped, last 2 didn't
'required|email|unique:'User',email|max:254',

1 个答案:

答案 0 :(得分:0)

这是一个有趣的案例。对于大多数Oracle Developer来说,标准可以使所有表名复数(用户与用户)。这可以帮助您避免这个问题。

基本上,您的问题不仅仅是引号,而是使用Oracle Reserverd Words:User。有关Oracle Reserverd Words的更多信息,请访问:http://docs.oracle.com/cd/B19306_01/em.102/b40103/app_oracle_reserved_words.htm

如果您负责设计数据库,请尽快执行以下操作:

  1. 避免使用Oracle保留字作为表名。
  2. 将表名保持为复数,以避免出现这种情况。
  3. 如果无法更改数据库,则必须继续寻找此问题的解决方法。


    我有一个解决方法,您需要对其进行测试,编辑模型User.php并更改表名以包含引号。

    protected $name = '"User"';
    

    我已经测试过,引号出现在生成的SQL查询中,但无法执行,因为我使用的是MySQL,所有的表名都包含在`中。