質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Q&A

0回答

1212閲覧

Laravelで1モデル内に同一のモデルに対する複数のmorphリレーションを持ちたい。

newmog2004

総合スコア12

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

0グッド

0クリップ

投稿2021/10/08 19:58

前提・実現したいこと

全体で共有する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クラスを追加して・・・と仕様が大きく変わってしまうのも影響度が大きいと感じます。

何か良い解決策はないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問