manyリレーションについてはわかっているが、polymorphoicリレーションについてはわからないという人も多いと思います。リレーションをできるだけたくさんの人に理解してもらえるように説明を行っていきます。Userへのデータ登録PolymorphicリレーションについてBlogのアプリケーションを構築する例を使って説明していきます。Blogアプリケーションにユーザを保存するUserモデルと記事を保存するPostモデルを作成し、各ユーザにはプロファイル画像、各記事にはトップ画像を保存できるとします。通常であれば、各モデルにひもづく画像が1枚であれば、Userモデルにプロファイル画像の情報を保存する列、Postモデルにはトップ画像の情報を保存する列を作成することになります。manyリレーションの延長上であれば、User用のUserImageモデル、Post用のPostImageモデルを作ることになるかと思います。polymorphicでは、画像の情報を保存するImageモデルを1つ追加し、UserとPostから同時にリレーションをもたせます。ImageモデルをUserモデルとPostモデルで共有します。この共有化を行うことがPolymorphicリレーションを持たせることを意味します。Imageモデルを共有Polymorphicのテーブル構造についてLaravelではpolymorphicを使用するためにimageable_idとimageable_typeという2つの列を追加し、この2つの列を使って共有化を実現します。imageable_typeには、App\UserかApp\Postのどちらかのモデル情報を保存し、imageable_idにはUserかPostのどちらかのidを保存します。idはUserとPostで同じ値を持つことがありますが、type列でUserかPostを識別できるため、idとtypeを組み合わせることで同じidとtypeを持った行が絶対に重複することはありません。Userの中で同じidを持つことはありません。最終的にテーブルにデータを登録すると以下のような関連を持たせることができます。テーブルの構造と関係Userテーブルのユーザidが2のプロファイル画像を登録したい場合は、imageable_typeにはApp\User、imageable_idに2を指定して保存を行います。保存した画像は、imageable_typeにApp\User、imageable_idに2を指定すれば取得することができます。Polymorphicテーブルを作成ここまでの説明でpolymorphicのイメージはつかめてもらえたかと思います。ここからは上記の説明で使った例を使って実際にテーブルを作成して、動作確認を行っていきます。Userテーブルの作成usersテーブルのマイグレーションファイルはインストール時にLaravelで作成されますが、構造をシンプルにするためにnameとemailのみの列として作成します。make:modelコマンドで作成します。以下のコマンドでは、migrationファイルも同時に作成されます。-mpostsテーブルにはシンプルにするためname列だけで作成します。$table->timestamps();});}Polymorphicテーブルの作成(Image)つぎにPolymorphicで最も重要なImage.phpファイルを作成します。-mマイグレーションファイルにはファイルのパスを保存する列とPolymorphicで使用するimageable列には、stringやintegerといった通常の型ではなくmorphs使用して作成します。});}列の型をmorphsにすることによってどのような列が追加されるか確認を行います。使用するデータベースによってテーブル情報の確認方法は異なりますが、本環境はsqliteを使用しているので、sqliteで確認すると下記のようにimageable_typeとimageable_idが追加されていることがわかります。table_info('images');0|id|integer|1||11|imageable_type|varchar|1||02|imageable_id|integer|1||03|file_path|varchar|1||04|created_at|datetime|0||05|updated_at|datetime|0||0morphsで列を作成するとLaravelが自動で列名_typeと列名_idの持った2つの列を作成してくれます。PostモデルとImageモデルとの関係をModelファイルを使用して記述します。User.phpにmorphOneメソッドを追加します。oneリレーションシップではhasOneメソッドとなりますが、PolymorphicではmorphOneになります。manyのpolymorphicではmorphManyを使用します。Post.phpにも同様にmorphOneメソッドを追加します。'imageable');}Imageモデルには、morphToメソッドを追加します。oneリレーションシップでのbelongsToメソッドに相当します。manyのpolymorphicでもmorphToを使用します。tinkerを使用して、Imageモデルへのデータの登録を行います。Postモデルを使用してpostsテーブルに1件データを作成します。作成したデータは$postに保存します。次にImageモデルを使用して$imageを作成し、$imeageのfile_pathにimage/post_1.imgを設定します。Postモデルはimageメソッドを持っているのでimageメソッドを使用して$imageを保存しています。この処理により、$postと$imageが関連づけられます。保存後のimageテーブルのimageable_typeには、App\Postが入っていることが確認できます。}データ登録後は、Postに関連する画像は下記のように取得することができます。"image/post_1.img"Userへのデータ登録userへのデータ登録もpostと同様に行うことができます。}先程はpostを使用してimageの情報を取得しましたが、今度はimageからuserもしくはpostの情報を取得します。Imageのidが2にはUserの情報、Imageのidが1にはPostの情報が入っているので結果は下記のようになります。名前がpolymorphicと発音も意味もわからない難しいイメージのある単語なので名前の通り難しいそうという印象を受けてしまいそうですが、シンプルな例を使って動作確認を行うと難しいものではないとわかっていただけたのではないでしょうか。要は1つのモデルを2つのモデルで共有するための仕組みです。