yajra / laravel-oci8

Oracle DB driver for Laravel via OCI8
https://yajrabox.com/docs/laravel-oci8
MIT License
834 stars 237 forks source link

Errors when trying to query tables with lower cased names #743

Open BARNZ opened 1 year ago

BARNZ commented 1 year ago

Summary of problem or feature request

The database I'm trying to connect to has a table named like this: "vwInt_dimProject". When I try to query this table with the query builder it auto-capitalises the table name resulting in "VWINT_DIMPROJECT" which gives me the following error:

select * from VWINT_DIMPROJECT

ORA-00942: table or view does not exist

Code snippet of problem

Simple model defined like this:

image

I have traced the problem down to this line here:

https://github.com/yajra/laravel-oci8/blob/9.x/src/Oci8/Query/Grammars/OracleGrammar.php#L275

If I comment out this Str::upper statement then everything works fine.

Perhaps we can have a way to disable this line? Or make it respect the PDO::ATTR_CASE setting?

System details

yajra commented 1 year ago

Thank you for reporting, I think this is a valid concern when working with an existing database.

I think PDO::ATTR_CASE is for the column casing and I currently use lowercase, thus making that config contradicts the current setup. Maybe we can add another config for the wrapping?

I will review this further when I got the chance. Please do not hesitate to submit a PR if you can.

hpacleb commented 1 year ago

As a temporary workaround I would suggest overriding the getTable method and adding DB::raw to your model.

    public function getTable()
    {
        return DB::raw('"' . ($this->table ?? Str::snake(Str::pluralStudly(class_basename($this)))) . '"');
    }

EDIT: This would only work for table names though, the query builder would still be broken once columns with Natural Case is used.