Heim  >  Artikel  >  PHP-Framework  >  Eine kurze Analyse von Many-To-Many in Laravel

Eine kurze Analyse von Many-To-Many in Laravel

藏色散人
藏色散人nach vorne
2021-07-02 14:21:491246Durchsuche

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:

  1. Ein Benutzer entspricht einem Benutzerprofil
  2. Ein Benutzer kann mehrere Artikel veröffentlichen
  3. 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 -ManyDies 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();
        });

当然,解决这个经典问题单单靠这两张表还不足够,需要在这两张表之外再建立一个关系表,用来将articletag联系起来,在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');
    }

这里注意两点:

  1. 你可以在声明关系的时候指定外键,如$this->belongsToMany('AppArticle','foreign_key', 'other_key');
  2. 如果在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
rrreee🎜Tags-Tabelle erstellen🎜rrreee🎜Natürlich hängt die Lösung dieses klassischen Problems nur davon ab Diese beiden Tabellen reichen nicht aus. Sie müssen zusätzlich zu diesen beiden Tabellen eine Beziehungstabelle erstellen, um article und tag zu verbinden Nach den offiziellen Standardregeln sollte die dritte Tabelle so aussehen: 🎜🎜Tabellenname article_tag🎜rrreee🎜Wenn Sie sich nicht an die offiziellen Spezifikationen halten, müssen Sie Fremdschlüssel im Modell angeben. 🎜

2. Erstellen Sie das Modell und geben Sie die Beziehung an

🎜In Article.php: 🎜rrreee🎜In Tag.php: 🎜rrreee🎜Hinweis hier Zwei Punkte: 🎜🎜🎜Sie können den Fremdschlüssel angeben, wenn Sie die Beziehung deklarieren, z. B. $this->belongsToMany('AppArticle','foreign_key', 'other_key');🎜🎜Wenn in Article_tag Sie haben timestamps() zur Tabelle hinzugefügt, d ')->withTimestamps ();🎜🎜

3. Wird in Controller

🎜 verwendet. Wenn wir sehen möchten, welche Tags ein Artikel enthält, können wir dies tun :🎜rrreee🎜Wenn wir Artikel nach einem bestimmten Tag finden möchten: 🎜rrreee🎜Das Obige implementiert Many-To-Many.🎜🎜 in Laravel

Das obige ist der detaillierte Inhalt vonEine kurze Analyse von Many-To-Many in Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen