前提・実現したいこと
全体で共有するFileモデルを生成し、それをアプリケーション内で共有したいと考えています。
Fileモデルは、ファイルパスなどを持ち、morphToを使用して
他の各モデル(例としてContentとBook)から参照するつもりです。
例として下記のようなモデル構造とします。
(マニュアルの1対1(ポリモーフィック)と同等です。)
[File] ※ファイル - id - path - fileable_id - fileable_type [Content] ※コンテンツ - id - title - description [Book] ※書籍 - id - title - ISBN
この中で、例えばコンテンツのサムネイル画像を管理するとして、下記のように定義したとします。
PHP
1class Content extends Model { 2 public function thumbnail { 3 return $this->morphOne(File::class, 'fileable'); 4 } 5}
将来、コンテンツの「オリジナル画像も管理したい」という要件が追加された場合、
PHP
1class Content extends Model { 2 // サムネイル 3 public function thumbnail { 4 return $this->morphOne(File::class, 'fileable'); 5 } 6 7 // オリジナル画像 8 public function original { 9 return $this->morphOne(File::class, 'fileable'); 10 } 11}
のように、1つのモデルの中で、別の目的で使用するmorphリレーションを持つことは可能なのでしょうか?
課題・試したこと
将来のために考えた一つの解決策として、Thumbnailモデルを定義して、
ContentとOneToOneリレーションとしておくことも考えました。
PHP
1// コンテンツ 2class Content extends Model { 3 public function thumbnail { 4 return $this->hasOne(Thumbnail::class); 5 } 6} 7 8// サムネイル 9class Thumbnail extends Model { 10 // コンテンツへのリレーション 11 public function content { 12 return $this->belongsTo(Content::class); 13 } 14 15 // ファイルへのリレーション 16 public function file { 17 return $this->morphOne(File::class, 'fileable'); 18 } 19}
しかし、現在サムネイル画像しか要件が無いのに、
ContentとThumbnailを分離しておくのもTooMuchだと思います。
が、後から「オリジナル画像を追加したい」という要件が上がった時に、
既存のサムネイルの仕様に対して、Thumbnailクラスを追加して・・・と仕様が大きく変わってしまうのも影響度が大きいと感じます。
何か良い解決策はないでしょうか?
あなたの回答
tips
プレビュー