Laravel Many-To-Many多对多关系模式示例详解

 更新时间:2023年06月28日 11:50:31   作者:JellyBool  
这篇文章主要为大家介绍了Laravel Many-To-Many多对多关系模式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

常见的对应关系模式

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

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

翻译过来就是:

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

在这些关系模型中,最难实现的就是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中:

public function tags()
    {
        return $this->belongsToMany('App\Tag');
    }

Tag.php中:

public function articles()
    {
        return $this->belongsToMany('App\Article');
    }

这里注意两点:

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

3. 在Controller中使用

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

$article = Article::find($id);
dd($article->tags);

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

public function showArticleByTagName($name)
    {
        $tag = Tag::where('value','=',$name)->first();
        dd($tag->articles);
    }

以上,就实现了在Laravel中的Many-To-Many,更多关于Laravel 多对多关系模式的资料请关注脚本之家其它相关文章!

相关文章

  • Yii核心组件AssetManager原理分析

    Yii核心组件AssetManager原理分析

    这篇文章主要介绍了Yii核心组件AssetManager原理分析,较为详细的分析了AssetManager组件的原理与实现过程,有助于深入了解yii框架的特性,需要的朋友可以参考下
    2014-12-12
  • php多文件上传下载示例分享

    php多文件上传下载示例分享

    这篇文章主要介绍了php多文件上传下载示例,需要的朋友可以参考下
    2014-02-02
  • PHP中重启php-fpm的几种方法汇总

    PHP中重启php-fpm的几种方法汇总

    这篇文章主要介绍了PHP中重启php-fpm的几种方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • PHP+jQuery翻板抽奖功能实现

    PHP+jQuery翻板抽奖功能实现

    在电视节目中有一种抽奖形式暂且叫做翻板抽奖,台上有一个墙面,墙面放置几个大方块,主持人或者抽奖者翻开对应的方块即可揭晓中奖结果。类似的抽奖形式还可以应用在WEB中,本文将使用PHP+jQuery为您讲解如何实现翻板抽奖程序。
    2015-10-10
  • PHP设计模式之建造者模式(Builder)原理与用法案例详解

    PHP设计模式之建造者模式(Builder)原理与用法案例详解

    这篇文章主要介绍了PHP设计模式之建造者模式(Builder)原理与用法,结合具体实例形式详细Fenix了建造者模式的概念、原理、用法及操作注意事项,需要的朋友可以参考下
    2019-12-12
  • thinkPHP显示不出验证码的原因与解决方法分析

    thinkPHP显示不出验证码的原因与解决方法分析

    这篇文章主要介绍了thinkPHP显示不出验证码的原因与解决方法,结合具体实例形式分析了thinkPHP关于验证码显示的相关配置方法与注意事项,需要的朋友可以参考下
    2017-05-05
  • 利用PHP生成CSV文件简单示例

    利用PHP生成CSV文件简单示例

    众所周知,CSV文件是以逗号(,)作为分隔符的一种文件,那么在知道组成原理的前提下,我们来操作它就方便多了。这篇文章主要介绍了利用PHP生成CSV文件的方法,文章给出了完整的示例代码,有需要的朋友们可以参考借鉴。
    2016-12-12
  • php实现数组重复数字统计实例

    php实现数组重复数字统计实例

    在本篇文章里我们给大家带来一个关于php实现数组重复数字统计的实例,有用到的朋友们参考下。
    2018-09-09
  • Yaf框架封装的MySQL数据库操作示例

    Yaf框架封装的MySQL数据库操作示例

    这篇文章主要介绍了Yaf框架封装的MySQL数据库操作,结合实例形式分析了Yaf框架基于PDO操作MySQL数据库的相关配置、连接、增删改查、统计等相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • php中文验证码实现示例分享

    php中文验证码实现示例分享

    这篇文章主要介绍了使用php实现中文验证码,代码简单,大家可以直接使用
    2014-01-01

最新评论