1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravelでポリモーフィックを使ってるにも関わらずnamespaceを変えてしまった時は

Last updated at Posted at 2022-01-03

背景

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でイイ感じに紐付けて引っ張ってこれる点に魅力を感じたものの、そもそもその責務はサービスレイヤーとかに任せる方が保守・拡張性の高いシステムになる気がした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?