ホームページ >PHPフレームワーク >Laravel >Laravel 開発: Laravel Eloquent を使用してポリモーフィックな関連付けを実装するには?

Laravel 開発: Laravel Eloquent を使用してポリモーフィックな関連付けを実装するには?

WBOY
WBOYオリジナル
2023-06-13 16:41:521681ブラウズ

Laravel 開発: Laravel Eloquent を使用してポリモーフィックな関連付けを実装する方法は?

ポリモーフィック関連付けは Laravel Eloquent の重要な機能であり、1 つのモデルが複数の異なるモデルとの関係を確立できるようになります。実際のアプリケーションでは、特にデータベース設計において、さまざまな種類のデータの処理が比較的簡単で効率的です。この記事では、Laravel Eloquent を使用してポリモーフィックな関連付けを実装する方法について説明します。

1. 多態性関連とは何ですか?

多態性関連付けとは、モデルと複数の異なるモデルの間の関連付け関係の確立を指し、一般的なカテゴリへの参照とみなすことができます。これは、次のような多くのアプリケーションに利便性をもたらします。

  1. 画像、オーディオ、およびビデオのモデルはすべて、コメント モデルと多態性の関連付けを確立できるため、コメントを複数のデータ型に適用できます。
  2. ユーザーは、コメント モデルとのポリモーフィックな関連付けを確立し、記事、写真、ビデオなどのさまざまなデータ タイプに適用できます。
  3. 注文モデルは配送先住所モデルと多態性の関連付けを確立できるため、注文を自宅、会社、販売店などの複数の住所タイプに配送できます。

2. ポリモーフィック関連付けを実装する方法

Laravel Eloquent を使用してポリモーフィック関連付けを実装する方法を見てみましょう。

まず、データ テーブルの設計を検討する必要があります。モデル間の多態的な関係を保存するための中間テーブルを作成する必要があります。このテーブルには次の列が含まれている必要があります:

  1. id: テーブルの主キー ID;
  2. target_type: ターゲット モデルのタイプ名;
  3. target_id: ターゲット モデルの IDターゲット モデル;
  4. source_type: ソース モデルのタイプ名;
  5. source_id: ソース モデルの ID。

次に、データベース移行ファイルの例を示します。

<?php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

class CreateCommentsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('comments', function (Blueprint $table) {
            $table->id();
            $table->morphs('commentable');
            $table->text('content');
            $table->timestamps();
        });

        Schema::create('votes', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('voteable_id');
            $table->string('voteable_type');
            $table->enum('type', ['up', 'down']);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('comments');
        Schema::dropIfExists('votes');
    }
}

上記の移行ファイルでは、コメントと投票という 2 つの新しいテーブルを作成しました。

コメント テーブルにはコメント モデルに関する基本情報が含まれており、morphs() メソッドを使用して多態性関連付けポインティングを実装します。投票テーブルも同様で、voteable_id フィールドと voteable_type フィールドを使用して多態性の関連付けを実装します。

次に、Eloquent モデルで関連付け関係を定義する必要があります。

コメント モデル:

<?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;

class Comment extends Model
{
    use HasFactory;

    public function commentable()
    {
        return $this->morphTo();
    }

    public function votes()
    {
        return $this->morphMany(Vote::class, 'voteable');
    }
}

投票モデル:

<?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;

class Vote extends Model
{
    use HasFactory;

    public function voteable()
    {
        return $this->morphTo();
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

上記のコードは、コメント モデルと投票モデルの多態性関係をそれぞれ定義します。 Comment モデルでは、morphTo() メソッドを使用してコメントへの多態性の関連付けを定義し、Vote モデルでは、morphMany() メソッドを使用してコメントへの多態性の関連付けを定義します。

3. 多態性関連付けの使用

多態性関連付けの使用方法を見てみましょう。

コメントの作成:

$article = Article::find(1);

$comment = $article->comments()->create([
    'content' => 'This is a comment',
]);

コメントの投票を取得:

$votes = $comment->votes;

記事のコメントを取得:

$comments = $article->comments;

投票:

$comment->votes()->create([
    'user_id' => 1,
    'type' => 'up',
]);

上記のコード例は、ポリモーフィック リレーションシップの基本的な使用法を示しています。この機能の詳細については、Laravel Eloquent ドキュメントを参照してください。

概要

ポリモーフィック関連付けは、Laravel Eloquent の重要な機能の 1 つであり、1 つのモデルが複数の異なるモデルとの関係を確立できるようになります。データベース設計やアプリケーション開発に非常に役立ちます。 Laravel Eloquent を使用して多態性リレーションシップを実装する場合、リレーションシップの中間テーブルを設計し、Eloquent モデルでリレーションシップを定義する必要があります。 morphTo() メソッドと morphMany() メソッドを使用して、ポリモーフィックな関係を実装できます。

以上がLaravel 開発: Laravel Eloquent を使用してポリモーフィックな関連付けを実装するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。