In der tatsächlichen Entwicklung kommen wir oft mit mehreren gängigen Korrespondenzmustern in Berührung:
One-To-One //一对一 One-To-Many //一对多 Many-To-Many //多对多
Als wir anfingen, mit diesen Konzepten in Kontakt zu kommen, habe ich es tatsächlich nicht getan Ich verstehe es nicht ganz. Aber sobald man diese Konzepte auf das Leben anwendet, ist es sehr einfach zu verstehen. Nehmen wir ein Beispiel, das wir oft online sehen:
User-To-Profile // One-To-One User-To-Articles // One-To-Many Articles-To-Tags // Many-To-Many
Übersetzt in:
- Ein Benutzer entspricht einem Benutzerprofil
- Ein Benutzer kann mehrere Artikel veröffentlichen
- Und Artikel und Tags haben eine Viele-zu-Viele-Beziehung; ein Tag kann zu mehreren Artikeln gehören.
Unter diesen Beziehungsmodellen ist Many-To das am schwierigsten zu implementierende -Many
Dies ist eine Viele-zu-Viele-Beziehung, aber mit Hilfe von Laravels leistungsstarkem Eloquent
ist es relativ reibungslos, diese Funktion zu implementieren. Many-To-Many
这种多对多的关系,不过借助Laravel的强大的Eloquent
,实现这个功能还是比较顺心的。
1. 创建数据库表
创建articles
表
Schema::create('articles', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('content'); $table->timestamps(); });
创建tags
表
Schema::create('tags', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); });
当然,解决这个经典问题单单靠这两张表还不足够,需要在这两张表之外再建立一个关系表,用来将article
和tag
联系起来,在Laravel中,如果你遵循官方的标准规则,第三张表应该是这样的:
表名 article_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
中:
<code><br> public function tags() { return $this->belongsToMany('App\Tag'); }</code>
在Tag.php
中:
public function articles() { return $this->belongsToMany('App\Article'); }
这里注意两点:
- 你可以在声明关系的时候指定外键,如
$this->belongsToMany('AppArticle','foreign_key', 'other_key');
- 如果在article_tag表中你添加了timestamps(),即表中出现created_at和updated_at这两个字段,在Article中声明关系的时候需要这样:
return $this->belongsToMany('AppTag')->withTimestamps();
3. 在Controller
中使用
如果我们想查看某个文章含有哪些标签,我们可以这样:
$article = Article::find($id); dd($article->tags);
如果我们想通过某个标签来查找文章:
<code><br>public function showArticleByTagName($name) { $tag = Tag::where('value','=',$name)->first(); dd($tag->articles); }</code>
以上,就实现了在Laravel中的Many-To-Many
1. Datenbanktabelle erstellen
Artikel
-Tabelle erstellen