Laravelの多対多

WBOY
WBOYオリジナル
2016-06-23 13:30:54935ブラウズ

実際の開発では、いくつかの一般的な対応パターンに遭遇することがよくあります:

One-To-One //一对一One-To-Many //一对多Many-To-Many //多对多

これらの概念に初めて触れたとき、私は実際にはよく理解できませんでした。しかし、これらの概念を生活に当てはめてみると、非常に簡単に理解できるようになります。オンラインでよく見かける例を見てみましょう。

User-To-Profile // One-To-OneUser-To-Articles // One-To-ManyArticles-To-Tags // Many-To-Many

翻訳は次のとおりです。

  • 1 つのユーザー プロフィールに対応します
  • 1 人のユーザー 複数公開できます。記事
  • そして、記事とタグには多対多の関係があります。1 つの記事に複数のタグを含めることができ、1 つのタグが複数の記事に属することができます
  • これらの関係モデルの中で、実装が最も難しいのは多対多です。多対多の関係ですが、Laravel の強力な Eloquent を使用すると、この関数を実装する方が便利です。
  • 1. データベーステーブルを作成する

    記事テーブルを作成する

    Schema::create('articles', function (Blueprint $table) {            $table->increments('id');            $table->string('title');            $table->text('content');            $table->timestamps();        });

    タグテーブルを作成する

    Schema::create('tags', function (Blueprint $table) {            $table->increments('id');            $table->string('name');            $table->timestamps();        });

    もちろん、これら 2 つのテーブルだけでは、この古典的な問題を解決するには十分ではありません。これら 2 つのテーブルに加えて、リレーションシップ テーブルを確立する必要があります。 Laravel では、公式の標準ルールに従う場合、3 番目のテーブルは次のようになります:

    テーブル名 item_tag

    Schema::create('article_tag', function(Blueprint $table) {            $table->integer('article_id')->unsigned()->index();            $table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade');            $table->integer('tag_id')->unsigned()->index();            $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');        });

    公式仕様に従わない場合は、外部キーを指定する必要があります。モデルで。

    2. モデルを作成し、関係を指定します

    Article.php 内:

    <br />    public function tags()    {        return $this->belongsToMany('App\Tag');    }

    Tag.php 内:

    public function articles()    {        return $this->belongsToMany('App\Article');    }

    ここで 2 つの点に注意してください:

    $this などの関係を宣言するときに外部キーを指定できます。 ->belongsToMany('AppArticle','foreign_key', 'other_key');

    article_tag テーブルに timestamps() を追加する場合、つまり、created_at と updated_at の 2 つのフィールドがテーブルに表示される場合は、Article で関係を宣言します。次のようにする必要があります: return $this->belongsToMany('AppTag')->withTimestamps();
  • 3. 記事に含まれるタグを確認したい場合は、これを実行できます。 :
  • $article = Article::find($id);dd($article->tags);
  • 特定のタグで記事を検索したい場合:

    <br />public function showArticleByTagName($name)    {        $tag = Tag::where('value','=',$name)->first();        dd($tag->articles);    }

    上記はLaravelで多対多を実装しています。

    Happy Hacking

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