登录  /  注册
首页 > php框架 > Laravel > 正文

简析Laravel中的Many-To-Many

藏色散人
发布: 2021-07-02 14:21:49
转载
1075人浏览过

在实际的开发中,我们经常会接触到几种常见的对应关系模式:

One-To-One //一对一

One-To-Many //一对多

Many-To-Many //多对多
登录后复制

在刚刚开始接触到这些概念的时候,其实我是不太理解的。但是一旦你将这些概念应用到生活中,理解起来就很简单了,就举一个与我们在网上经常见到的例子:

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

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

Articles-To-Tags // Many-To-Many
登录后复制

翻译过来就是:

  1. 一个用户对应一个用户档案
  2. 一个用户可以发表多篇文章
  3. 而文章和标签确实多对多的关系,一篇文章可以有多个标签;一个标签可以属于多篇文章

在这些关系模型中,最难实现的就是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-&gt;belongsToMany('App\Tag');
    }</code>
登录后复制

Tag.php中:

public function articles()
    {
        return $this-&gt;belongsToMany('App\Article');
    }
登录后复制

这里注意两点:

  1. 你可以在声明关系的时候指定外键,如$this-&gt;belongsToMany('App\Article','foreign_key', 'other_key');
  2. 如果在article_tag表中你添加了timestamps(),即表中出现created_at和updated_at这两个字段,在Article中声明关系的时候需要这样:return $this-&gt;belongsToMany('App\Tag')-&gt;withTimestamps();

3. 在Controller中使用

如果我们想查看某个文章含有哪些标签,我们可以这样:

$article = Article::find($id);

dd($article-&gt;tags);
登录后复制

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

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

        dd($tag-&gt;articles);
    }</code>
登录后复制

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

以上就是简析Laravel中的Many-To-Many的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
相关标签:
来源:segmentfault网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号