背景
ORMでポリモーフィックをいい感じにやってくれるなら使わない手はないということで安易に使った後で、リファクタリングの際に利用しているEloquentモデルのnamespaceを変えてしまった。
App\Models\Document => App\Models\Hoge\Document
こうしてしまうと、これまでフィールドに使っていたApp\Models\Document
が利用できなくなってしまう。
解決策
Relation::morphMap
を利用する。
詳しくはこちらに書いてあるので公式を参照
https://readouble.com/laravel/6.x/ja/eloquent-relationships.html
簡単にいうと完全なクラス名で参照していたところを任意の名前に変更しかつ、その任意の名前からクラスを参照するようにバイバスできる。
Relation::morphMap([
'document' => 'App\Models\Hoge\Document'
]);
ただこれを使う場合には、該当のフィールドを全部カスタム名に変更する必要が出てしまうため注意。
*6系はデフォのクラス名のケースとカスタム名のケースの両立ができない模様
それでも使う場合には、serviceproviderを新規に作成するかAppServiceProviderの中で定義してあげれば良い。
そもそも論
リファクタリングをきっかけに気づいたけれど、使うならアプリケーションサイドの変更がDBサイドに影響しないように最初からカスタム名を使うべきだった。
またDBでイイ感じに紐付けて引っ張ってこれる点に魅力を感じたものの、そもそもその責務はサービスレイヤーとかに任せる方が保守・拡張性の高いシステムになる気がした。