ホームページ >バックエンド開発 >PHPチュートリアル >雄弁さの多型関係を再導入します
コアポイント
morphTo
またはmorphMany
メソッドは他のモデルに関連付けられたモデルに使用されます。 morphOne
MorphMap
この記事は、Younes Rafieによって査読されました。 SetePointのコンテンツを完璧にするために、SetePointのすべてのピアレビューアに感謝します!
Laravelで共通するなど、モデルまたはデータベーステーブルの間に異なるタイプの関係を使用している可能性があります。しかし、もう1つの一般的でないタイプがあります:多型関連。では、多型協会とは何ですか?
多型協会とは、1つの関連付けの複数の他のモデルに属するモデルを指します。
これを説明するために、トピックと投稿モデルがある架空のシーンを作成しましょう。ユーザーはトピックや投稿にコメントを残すことができます。多型関係を使用して、両方のケースに単一のコメントテーブルを使用できます。驚くべきことに、そうですか?理想的には、post_commentsテーブルとTopic_commentsテーブルを作成してコメントを区別する必要があるため、これは少し非現実的です。多型関係を使用して、2つのテーブルは必要ありません。実用的な例を介して多型の関係を理解しましょう。何を構築するか
曲とアルバムを含むデモミュージックアプリを作成します。このアプリでは、曲やアルバムが好きです。多型関係を使用して、両方のケースに単一のUPVotesテーブルを使用します。まず、この関係を構築するために必要なテーブル構造を調べましょう。
および列について説明しましょう。
列にはアルバムまたは曲のID値が含まれ、<code>albums id - integer name - string songs id - integer title - string album_id - integer upvotes id - integer upvoteable_id - integer upvoteable_type - string </code>列にはモデルを所有するクラス名が含まれます。
列は、ORMがupvoteable_id
関係にアクセスするときにモデルを所有するために戻る「タイプ」を決定する方法です。 upvoteable_type
私はあなたがすでにランニングアプリケーションを持っていると仮定します。そうでない場合、この高度なクイックスタートコースが役立つ場合があります。最初に3つのモデルと移行を作成し、次に私たちのニーズに合わせて移行を編集しましょう。
<code>albums id - integer name - string songs id - integer title - string album_id - integer upvotes id - integer upvoteable_id - integer upvoteable_type - string </code>
モデルを作成するときに-m
フラグを渡すと、これらのモデルに関連する移行が生成されることに注意してください。これらの移行のup
メソッドを調整して、目的のテーブル構造を取得しましょう。
{some_timestamp}_create_albums_table.php
<code>php artisan make:model Album -m php artisan make:model Song -m php artisan make:model Upvote -m </code>
{some_timestamp}_create_songs_table.php
<code class="language-php">public function up() { Schema::create('albums', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); }</code>
{some_timestamp}_create_upvotes_table.php
<code class="language-php">public function up() { Schema::create('songs', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->integer('album_id')->unsigned()->index(); $table->timestamps(); $table->foreign('album_id')->references('id')->on('albums')->onDelete('cascade'); }); }</code>ここで、職人移行コマンドを実行してこれらの3つのテーブルを作成できます。
アルバム、歌、いいねの間の多型の関係に注意を払うようにモデルを構成しましょう:
<code class="language-php">public function up() { Schema::create('upvotes', function (Blueprint $table) { $table->increments('id'); $table->morphs('upvoteable'); // 添加无符号整数 upvoteable_id 和字符串 upvoteable_type $table->timestamps(); }); }</code>
app/Upvote.php
<code>php artisan migrate</code>
app/Album.php
<code class="language-php">[...] class Upvote extends Model { /** * 获取所有拥有模型。 */ public function upvoteable() { return $this->morphTo(); } }</code>
app/Song.php
アルバムと曲のモデルの
<code class="language-php">class Album extends Model { protected $fillable = ['name']; public function songs() { return $this->hasMany(Song::class); } public function upvotes() { return $this->morphMany(Upvote::class, 'upvoteable'); } }</code>
関係を定義した後、多型の関係がどのように機能するかをよりよく理解するためにアプリケーションを試してみることができます。このアプリのビューは作成されません。コンソールからアプリのみを試してみます。 upvotes
コンソールを始めましょう:
検索関係
<code class="language-php">class Song extends Model { protected $fillable = ['title', 'album_id']; public function album() { return $this->belongsTo(Album::class); } public function upvotes() { return $this->morphMany(Upvote::class, 'upvoteable'); } }</code>データが準備が整ったので、モデルを介して関係にアクセスできます。これは、UPVotesテーブルのデータのスクリーンショットです:
アルバムのようなすべてにアクセスするには、dynamic属性を使用できます:
また、upvotes
への呼び出しを実行する方法の名前にアクセスすることにより、多型モデルから多型関係の所有者を取得することもできます。私たちの場合、それはupvoteモデルの
<code>php artisan tinker >>> $album = App\Album::create(['name' => 'More Life']); >>> $song = App\Song::create(['title' => 'Free smoke', 'album_id' => 1]); >>> $upvote1 = new App\Upvote; >>> $upvote2 = new App\Upvote; >>> $upvote3 = new App\Upvote; >>> $album->upvotes()->save($upvote1); >>> $song->upvotes()->save($upvote2); >>> $album->upvotes()->save($upvote3);</code>
upvoteモデルのmorphTo
関係は、アルバムインスタンスのインスタンスが所有しているため、アルバムインスタンスを返します。 upvoteable
曲やアルバムの数字の数を得ることができるので、ビューの好きなものに基づいて曲やアルバムを並べ替えることができます。それが音楽チャートの仕組みです。
<code>albums id - integer name - string songs id - integer title - string album_id - integer upvotes id - integer upvoteable_id - integer upvoteable_type - string </code>カスタム多型タイプ
はそれぞれupvoteable_type
またはApp\Album
に属している可能性があります。 App\Song
)。これは、列に非常に長い最大長を設定する必要があることを意味します。これは、App\Models\Data\Topics\Something\SomethingElse
メソッドが役立つ場所です。 MorphMap
AppServiceProviderのブート関数にMORPHMAPを登録するか、別のサービスプロバイダーを作成できます。新しい変更が有効になるためには、Composer Dump-Autoloadコマンドを実行する必要があります。だから今、私たちはこのようなレコードを追加することができます:
<code>php artisan make:model Album -m php artisan make:model Song -m php artisan make:model Upvote -m </code>
前の例とまったく同じ動作します。
<code class="language-php">public function up() { Schema::create('albums', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); }</code>
結論
あなたが今、あなたが多型の関係と、これらのタイプの関係に何が必要かを理解していることを願っています。多型の関係のもう少しのより高度な例はこちらです。これが役立つと思う場合は、友達と共有して、[いいね]ボタンをクリックすることを忘れないでください。以下のコメントセクションにご意見をお聞かせください!
Eloquentの多型関係についてのFAQLaravelで多型関係を使用することの利点は何ですか?
メソッドを使用して行われます。次に、他のモデルに関連付けられるモデルでは、関係が1対1であるか1対1かどうかに応じてmorphTo
またはmorphMany
メソッドを使用します。 morphOne
関連レコードを取得するために多型関係を使用する方法は?
<code>albums id - integer name - string songs id - integer title - string album_id - integer upvotes id - integer upvoteable_id - integer upvoteable_type - string </code>他の雄弁な関係と同様に、多型の関係で関連する記録を取得できます。たとえば、投稿からすべてのコメントを取得する場合は、これを行うことができます。
他の雄弁な関係と同様の多型関係に関連するレコードを保存します。モデルを使用してモデルを関連付けて、モデルを保存できます。例は次のとおりです。
<code>php artisan make:model Album -m php artisan make:model Song -m php artisan make:model Upvote -m </code>
associate
多型関係は、モデルが他の複数のタイプのモデルに属する可能性がある状況で特に役立ちます。いくつかの一般的なユースケースには、投稿やユーザーに属するコメント、複数のタイプのコンテンツに適用できるタグ、さまざまなタイプのエンティティに添付できる画像またはファイルが含まれます。
<code class="language-php">public function up() { Schema::create('albums', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); }</code>多型関係を使用することの制限または短所は何ですか?
多型関係で関連するレコードを削除する方法は?
メソッドを使用して、ポリ型関係で関連するレコードを削除できます。たとえば、投稿からすべてのコメントを削除するには、これを行うことができます。
はい、Laravelはdelete
<code class="language-php">public function up() { Schema::create('songs', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->integer('album_id')->unsigned()->index(); $table->timestamps(); $table->foreign('album_id')->references('id')->on('albums')->onDelete('cascade'); }); }</code>
morphToMany
morphedByMany
これにより、
以上が雄弁さの多型関係を再導入しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。