Help us understand the problem. What is going on with this article?

Laravelでvendor内の処理をオーバーライドする方法

実際にぶち当たった問題

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』

比較

190711_OracleGrammar.php比較.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を以下のように追記する

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした