はじめに
前のセクションでは、フラッシュ メッセージの使用方法を説明し、それが何であるかを学びましたフラッシュメッセージなので簡単に使えます。このセクションでは、記事タグを例として、データベースの多対多形式について説明します。
手順
開発環境: 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');}
次に、移行を実行し、コマンドラインで実行します: php 職人 移行
次に、先ほど作成した Tag.php を開きます。
タグとアーティクルには多対多の関係があるため、タグ モデル クラスにはアーティクルを指すメソッドも必要です。
public function articles(){ return $this->belongsToMany('App\Article'); |}
>>> $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", ], ]
いじりモード:
>>> 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.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", ], ], ]
まとめ
今日の内容を吸収して消化していただければ幸いです。相互励まし合い。