当前位置: 代码网 > it编程>编程语言>Php > Laravel Many-To-Many多对多关系模式示例详解

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

2024年05月18日 Php 我要评论
常见的对应关系模式在实际的开发中,我们经常会接触到几种常见的对应关系模式:one-to-one //一对一one-to-many //一对多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 多对多关系模式的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com