1. hamkiti

    Posted

    hamkiti
Changes in title
+Laravelでvendor内の処理をオーバーライドする方法
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,81 @@
+
+##実際にぶち当たった問題
+
+https://github.com/yajra/laravel-oci8
+yajra/laravel-oci8 に依存した実装でORACLE上の予約語カラムが含まれるクエリーを実行しようとすると失敗する。
+
+
+```log:エラーログ例
+
+[2019-07-09 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-11 10:36:39,hogeuser]
+
+```
+※『PASSWORD』が予約語でした。実際のカラム名は『password』
+
+
+原因はver5.4まではクエリーを組み立てるときに予約語でないことを判別してカラム名を大文字に変換していたけど、ver5.5以降は問答無用で変換するようになってしまったためのようでした。
+
+##比較
+![190711_OracleGrammar.php比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66209/58cbe457-6a36-ab6d-4e70-2f8de888e8d6.png)
+
+
+|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を以下のように追記する
+
+```json: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) コマンドを実行
+
+```log:実行コマンド
+composer dump-autoload
+```
+
+
+
+
+
+##参考
+Laravel How to override vendor class file?
+http://shyammakwana.me/php/laravel-override-vendor-classes.html
+
+
+