我正在尝试将我的一个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',
答案 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
如果您负责设计数据库,请尽快执行以下操作:
如果无法更改数据库,则必须继续寻找此问题的解决方法。
我有一个解决方法,您需要对其进行测试,编辑模型User.php
并更改表名以包含引号。
protected $name = '"User"';
我已经测试过,引号出现在生成的SQL查询中,但无法执行,因为我使用的是MySQL,所有的表名都包含在`
中。