ホームページ > バックエンド開発 > PHPチュートリアル > [Laravel 5 基礎] 21 – 多対多の関係とタグ

[Laravel 5 基礎] 21 – 多対多の関係とタグ

WBOY
リリース: 2016-06-20 12:30:01
オリジナル
921 人が閲覧しました

多対多の関係のタグの例

はじめに

前のセクションでは、フラッシュ メッセージの使用方法を説明し、それが何であるかを学びましたフラッシュメッセージなので簡単に使えます。このセクションでは、記事タグを例として、データベースの多対多形式について説明します。

手順

開発環境: Windows 7

Laravel バージョン: 5+

IDE: Phpstorm

データベースはここにあります。Laravel の Eloquent と Migration を以前 2 つのセクションで紹介し、リレーションシップのデータ テーブル間の外部キー関係について説明しました。これも基本的な 1 対です。多くの。

このセクションでは、データベース内の多対多について説明します。例としては、タグ、記事タグが挙げられます。

タグの紹介

これで、記事を書く、記事を公開するなど、ブログの基本的な機能が完成しました。しかし、記事数が増えてくると、記事の選別や管理が問題になってきますが、各記事のキーワードにタグを付けることができれば、記事の管理が大幅に改善されます。

Eloquent が記事のタグ付けをどのように実装しているかを見てみましょう。

Article.php を開きます。各記事 (記事) に作成者 (ユーザー) を関連付けるために使用した方法をまだ覚えていますか?忘れてください。答えることはできません。下部の user() メソッドで、記事がどこに属しているかを示す「belongsTo」という文を書きます。このステートメントは hasMany に関連しています。1 つの記事は 1 人の著者にのみ属することができますが、1 人の著者は複数の記事を持つことができます。これが関係です。

しかし、ここでのタグでは、belongsTo と hasMany は少し無理が​​あります。記事は 1 つのタグにのみ属することはできません。意味をなすためには、belongsToMany タグでなければなりません。

以下に示すように、user() メソッドの下に tags() メソッドがあります。

public function tags(){  return $this->belongsToMany('App\Tag');} 
ログイン後にコピー

次に、Tag Eloquent モデル Bar を作成しましょう。

タグ モデル クラスとタグ テーブルを作成します

コマンド ラインに次のコマンドを入力します: php 職人 make:model タグ。

コマンドラインに次のコマンドを入力します: php 職人 make:migration create tagtable –create=tags

この create tagtable.php を開き、ここにタグ テーブルの属性または列をいくつか作成します。 🎜>

public function up(){    Schema::create('tags', function (Blueprint $table) {        $table->increments('id');        $table->string('name');        $table->timestamps();    });    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');        $table->timestamps();    });}public function down(){    Schema::drop('tags');    Schema::drop('article_tag');} 
ログイン後にコピー

ピボット テーブル (つまり "article_tag" テーブル) も同時に作成されるのは、記事とタグを 1 つのテーブルで結び付けるための早見表として機能するためです。簡単に見つかります。

次に、移行を実行し、コマンドラインで実行します: php 職人 移行

次に、先ほど作成した Tag.php を開きます。

タグとアーティクルには多対多の関係があるため、タグ モデル クラスにはアーティクルを指すメソッドも必要です。

public function articles(){     return $this->belongsToMany('App\Article');                        |} 
ログイン後にコピー

Afterコマンドラインを開いて、tinker で成功を確認します。 php 職人 tinker

>>> $tag = new App\Tag;=> App\Tag {#646}>>> $tag->name='personal';=> "personal">>> $tag->save();=> true>>> App\Tag::all()->toArray();=> [    [      "id" => 1,      "name" => "personal",      "created_at" => "2016-04-30 13:48:49",      "updated_at" => "2016-04-30 13:48:49",    ],  ] 
ログイン後にコピー

記事とタグを関連付けます

これら 2 つのテーブルを関連付けてみましょう。

いじりモード:

>>> App\Tag::all()->toArray();=> [    [      "id" => 1,      "name" => "personal",      "created_at" => "2016-04-30 13:48:49",      "updated_at" => "2016-04-30 13:48:49",    ],  ]>>> $article=App\Article::first();=> App\Article {#659    id: "1",    user_id: "1",    created_at: "2016-03-20 15:05:18",    updated_at: "2016-03-20 15:05:18",    title: "谭晓龙创建的文章",    body: "真的是",    published_at: "2016-03-28 00:00:00",  }>>> $article->toArray();=> [    "id" => 1,    "user_id" => "1",    "created_at" => "2016-03-20 15:05:18",    "updated_at" => "2016-03-20 15:05:18",    "title" => "谭晓龙创建的文章",    "body" => "真的是",    "published_at" => "2016-03-28 00:00:00",  ]>>> $article->tags()->attach(1);Illuminate\Database\QueryExceptionwithmessage 'SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: article_tag.created_at (SQL: insert into "article_tag" ("article_id", "tag_id") values (1, 1))' 
ログイン後にコピー

ここでの $article->tags()->attach(1) は tags() メソッド Bind を使用します。 id=1のタグを記事に貼り付けます。

残念ながら、作成時間がなかったため、エラーが発生しました。変更してください。

Article.php を開き、tags() メソッドを見つけて次のように変更します。

public function tags(){    return $this->belongsToMany('App\Tag')->withTimestamps();} 
ログイン後にコピー

以上です。

再度アタッチ コマンドを実行します:

>>> $article = App\Article::first();=> App\Article {#655    id: "1",    user_id: "1",    created_at: "2016-03-20 15:05:18",    updated_at: "2016-03-20 15:05:18",    title: "谭晓龙创建的文章",    body: "真的是",    published_at: "2016-03-28 00:00:00",  }>>> $article->tags()->attach(1);      => null>>> DB::select('select * from article_tag');=> [    {#650      +"article_id": "1",      +"tag_id": "1",      +"created_at": "2016-04-30 14:00:31",      +"updated_at": "2016-04-30 14:00:31",    },  ]>>> $article->tags->toArray();=> [    [      "id" => 1,      "name" => "personal",      "created_at" => "2016-04-30 13:48:49",      "updated_at" => "2016-04-30 13:48:49",      "pivot" => [        "article_id" => "1",        "tag_id" => "1",        "created_at" => "2016-04-30 14:00:31",        "updated_at" => "2016-04-30 14:00:31",      ],    ],  ]>>> $article->toArray();=> [    "id" => 1,    "user_id" => "1",    "created_at" => "2016-03-20 15:05:18",    "updated_at" => "2016-03-20 15:05:18",    "title" => "谭晓龙创建的文章",    "body" => "真的是",    "published_at" => "2016-03-28 00:00:00",    "tags" => [      [        "id" => 1,        "name" => "personal",        "created_at" => "2016-04-30 13:48:49",        "updated_at" => "2016-04-30 13:48:49",        "pivot" => [          "article_id" => "1",          "tag_id" => "1",          "created_at" => "2016-04-30 14:00:31",          "updated_at" => "2016-04-30 14:00:31",        ],      ],    ],  ]>>> $article->tags->lists('name');  => Illuminate\Support\Collection {#653    all: [      "personal",    ],  } 
ログイン後にコピー

記事を関連付けた後、記事をタグに関連付けます:

>>> $tag=App\Tag::first();=> App\Tag {#666    id: "1",    name: "personal",    created_at: "2016-04-30 13:48:49",    updated_at: "2016-04-30 13:48:49",  }>>> $tag->articles->toArray();=> [    [      "id" => 1,      "user_id" => "1",      "created_at" => "2016-03-20 15:05:18",      "updated_at" => "2016-03-20 15:05:18",      "title" => "谭晓龙创建的文章",      "body" => "真的是",      "published_at" => "2016-03-28 00:00:00",      "pivot" => [        "tag_id" => "1",        "article_id" => "1",      ],    ],  ] 
ログイン後にコピー

はは、タグとあなたは自動的に記事にバインドされ、それが直接反映されます。

まとめ

これが今日お話しする内容であり、Relationship の拡張と応用に相当します。

今日の内容を吸収して消化していただければ幸いです。相互励まし合い。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート