【问题标题】:Oracle doesnt understand Laravel SQL queriesOracle 不理解 Laravel SQL 查询
【发布时间】:2016-11-08 13:15:36
【问题描述】:

我正在使用 Laravel 5.2,我正在尝试使用 laravel eloquent 执行 sql 查询。

但是 Oracle 不理解 laravel 查询。

这是 Laravel 代码:

    public function postLogincheck(Request $request){


    $rules = array(
        'name'    => 'required|min:3',
        'password' => 'required|alphaNum|min:3'
    );

    $messages = array(
        'required'=>':attribute alanı gereklidir.',
        'min'=>':attribute alanına en az :min karakter girmelisiniz',
        'alphaNum'=>':attribute alanına alfanümerik karakterler girebilirsiniz'
    );

    $validator = Validator::make(Input::all(), $rules,$messages);

    if ($validator->fails()) {
        return Redirect::to('login')
            ->withErrors($validator)
            ->withInput(Input::except('password'));
    } else {

        if (Auth::attempt(array('name' => $request->name, 'password' => $request->password))) {

            flash()->success('Giriş başarılı');

            return Redirect::to('/');

        }

        flash()->error('Giriş başarısız');

        return Redirect::to('/login');
    }

}

此方法检查用户是否登录。而 laravel 转换登录查询如下:

 select * from (select * from ReportUsers where upper(name) = upper(tsim)) where rownum = 1

但是 oracle 期待这个查询:

 select * from (select * from "ReportUsers" where upper("name") = upper('tsim')) where rownum = 1

我使用yajra laravel-oci8 connector 连接Oracle DB。

我也收到了这个问题的错误原因:

    Error Code : 942
Error Message : ORA-00942: tablo veya görüntü mevcut degil
Position : 29
Statement : select * from (select * from ReportUsers where upper(name) = upper(:p0)) where rownum = 1
Bindings : [tsim,tsim]
(SQL: select * from (select * from ReportUsers where upper(name) = upper(tsim)) where rownum = 1)

我该如何解决这个问题?

谢谢

【问题讨论】:

  • 你确定吗? SQL 非常标准化,我不再使用 Oracle,但我不记得引用表或列名。你的错误信息是什么?
  • @Devon 如果将表/列名称定义为区分大小写,则必须用双引号引起来。一般来说,这是一个完整的 PITA 恕我直言!
  • @Devon 是的,我确定。我编辑了问题以查看错误消息。
  • 如果可能重命名表,使其名称不区分大小写:rename "ReportUsers" to reportusers;
  • @Boneist,是的,那是一个 PITA。我想我一直使用snake_case 约定。

标签: php oracle laravel-5


【解决方案1】:

在这里只能勉强出去,因为我现在没有任何方法来测试它。

尝试添加:

protected $table = '"ReportUsers"';

到你的模型。

如果它不起作用,我会删除它。

【讨论】:

  • 问题不仅是表名格式,还有表属性格式。比如name应该是“名称”。
  • 从 cmets 看来,这似乎只是大写字符的情况。你试过这个并确认了吗?
【解决方案2】:

我遇到了同样的问题,只需在将要解决的文件 OracleGrammar.php 的第 206 行注释,它会测试它是否是带有大写名称的保留字。

//$value = $this->isReserved($value) ? Str::lower($value) : Str::upper($value);

文件路径为vendor->yajra->laravel-oci8->src->Oci8->query->Grammars

【讨论】:

    猜你喜欢
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2022-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多