Maison > cadre php > Laravel > le corps du texte

Une brève analyse de Many-To-Many dans Laravel

藏色散人
Libérer: 2021-07-03 09:02:25
avant
1235 Les gens l'ont consulté

Dans le développement réel, nous entrons souvent en contact avec plusieurs modèles de correspondance courants :

One-To-One //一对一

One-To-Many //一对多

Many-To-Many //多对多
Copier après la connexion

Quand nous avons commencé à entrer en contact avec ces concepts, en fait, je ne Je ne comprends pas très bien. Mais une fois que l’on applique ces concepts à la vie, c’est très simple à comprendre. Prenons un exemple que l’on voit souvent en ligne :

User-To-Profile // One-To-One

User-To-Articles // One-To-Many

Articles-To-Tags // Many-To-Many
Copier après la connexion

Traduit par :

  1. Un utilisateur correspond à un profil utilisateur
  2. Un utilisateur peut publier plusieurs articles.
  3. Et les articles et les balises ont une relation plusieurs-à-plusieurs. Un article peut avoir plusieurs balises ; une balise peut appartenir à plusieurs articles

Parmi ces modèles de relation, le plus difficile à mettre en œuvre est Many-To. -ManyIl s'agit d'une relation plusieurs-à-plusieurs, mais avec l'aide du puissant Eloquent de Laravel, il est relativement simple d'implémenter cette fonction. Many-To-Many这种多对多的关系,不过借助Laravel的强大的Eloquent,实现这个功能还是比较顺心的。

1. 创建数据库表

创建articles

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

创建tags

Schema::create('tags', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });
Copier après la connexion

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

如果你没有按照官方的规范来,你需要在模型中指定外键。

2. 创建模型并指定关系

Article.php中:

<code><br>    public function tags()
    {
        return $this->belongsToMany('App\Tag');
    }</code>
Copier après la connexion

Tag.php中:

public function articles()
    {
        return $this->belongsToMany('App\Article');
    }
Copier après la connexion

这里注意两点:

  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);
Copier après la connexion

如果我们想通过某个标签来查找文章:

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

        dd($tag->articles);
    }</code>
Copier après la connexion

以上,就实现了在Laravel中的Many-To-Many

1. Créer une table de base de données

Créer une table articles
rrreee🎜Créer une table tags🎜rrreee🎜Bien sûr, la résolution de ce problème classique ne repose que sur ces deux Une table ne suffit pas. Vous devez créer une table de relations en plus de ces deux tables pour connecter article et tag Dans Laravel, si vous suivez Selon le. règles standard officielles, le troisième tableau devrait ressembler à ceci : 🎜🎜Nom de la table article_tag🎜rrreee🎜Si vous ne suivez pas les spécifications officielles, vous devez spécifier des clés étrangères dans le modèle. 🎜

2. Créez le modèle et spécifiez la relation

🎜Dans Article.php : 🎜rrreee🎜Dans Tag.php : 🎜rrreee🎜Notez ici Deux points : 🎜🎜🎜Vous pouvez spécifier la clé étrangère lors de la déclaration de la relation, comme $this->belongsToMany('AppArticle','foreign_key', 'other_key');🎜🎜If in article_tag Vous avez ajouté timestamps() à la table, c'est-à-dire que les deux champs create_at et update_at apparaissent dans la table. Lorsque vous déclarez la relation dans Article, vous devez faire ceci : return $this->belongsToMany('AppTag. ')->withTimestamps ();🎜🎜

3. Utilisé dans le Contrôleur

🎜Si nous voulons voir quelles balises contient un article, nous pouvons le faire. : 🎜rrreee🎜Si nous voulons trouver des articles par une certaine balise : 🎜rrreee🎜Ce qui précède implémente Many-To-Many.🎜🎜 dans Laravel

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!