##実際にぶち当たった問題
https://github.com/yajra/laravel-oci8
yajra/laravel-oci8 に依存した実装でORACLE上の予約語カラムが含まれるクエリーを実行しようとすると失敗する。
[2019-07-20 15:06:06] local.ERROR: Error Code : 904
Error Message : ORA-00904: "PASSWORD": 無効な識別子です。
Position : 21
Statement : update "M_USER" set "PASSWORD" = :p0, "UPDATED_AT" = :p1 where "NAME" = :p2
Bindings : [*****************************,2019-07-20 15:06:06,hogeuser]
##原因
原因はver5.4まではクエリーを組み立てるときに予約語でないことを判別してカラム名を大文字に変換していたけど、ver5.5以降は問答無用で変換するようになってしまったためのようでした。
※エラーログに出ている大文字の『PASSWORD』が予約語でした。実際のカラム名は小文字で『password』
ver | git |
---|---|
5.4 | https://github.com/yajra/laravel-oci8/blob/5.4/src/Oci8/Query/Grammars/OracleGrammar.php |
5.5 | https://github.com/yajra/laravel-oci8/blob/5.5/src/Oci8/Query/Grammars/OracleGrammar.php |
##対策
###(1) パッケージのオーバーライド版を用意
任意のディレクトリにパッケージ(yajra/laravel-oci8)を丸ごとコピーし配置
※任意のディレクトリ
[プロジェクトフォルダ]/app/VendorOverrides/
問題の[比較]箇所の処理だけ書き換える
※5.4の処理に置き換える
###(2) composer.jsonを以下のように追記する
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
},
"exclude-from-classmap": [
"vendor\\yajra\\laravel-oci8\\src\\Oci8\\Query\\Grammars\\OracleGrammar.php"
],
"files":[
"app\\VendorOverrides\\yajra\\laravel-oci8\\src\\Oci8\\Query\\Grammars\\OracleGrammar.php"
]
},
###(3) コマンドを実行
composer dump-autoload
##参考
Laravel How to override vendor class file?
http://shyammakwana.me/php/laravel-override-vendor-classes.html