资讯专栏INFORMATION COLUMN

Laravel中的Many-To-Many

MartinDai / 1568人阅读

摘要:在实际的开发中,我们经常会接触到几种常见的对应关系模式一对一一对多多对多在刚刚开始接触到这些概念的时候,其实我是不太理解的。

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

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("AppTag"); }

Tag.php中:

public function articles()
    {
        return $this->belongsToMany("AppArticle");
    }

这里注意两点:

你可以在声明关系的时候指定外键,如$this->belongsToMany("AppArticle","foreign_key", "other_key");

如果在article_tag表中你添加了timestamps(),即表中出现created_at和updated_at这两个字段,在Article中声明关系的时候需要这样:return $this->belongsToMany("AppTag")->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.

Happy Hacking

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21022.html

相关文章

  • Laravel 5系列教程九:Eloquent Relationship

    摘要:至于一对一和一对多这两种关系,可以触类旁通。注意文件的下载或来源,请自行获取。接下来,我们使用取得文章的标签,这个就是我们声明多对多关系的方法。 原文来自 https://laravist.com/article/18 免费视频教程地址 https://laravist.com/series/laravel-5-basic Laravist是我刚刚上线的Laravel社区,有任何与L...

    haobowd 评论0 收藏0
  • Laravel 5系列教程十:实现文章的修改

    摘要:来看看具体的步骤注册路由在中,注册我们的编辑页面的路由这个路由接受一个参数,意为文章的,我们会需要根据这个来查询我们要修改的文章。然后渲染视图,并将查询到的和传给视图。下面我打算再开一个系列说说的新特性 原文来自https://laravist.com/article/20 免费视频教程地址 https://laravist.com/series/laravel-5-basic La...

    pf_miles 评论0 收藏0
  • Sequelizejs 关联

    摘要:看似一对一其实一对多这里的指的应该是查询数据主表结果中关联信息是以单个形式作为一个属性挂在主表每一个对象中实际上是主表与关联表的多对一关系拿中的和中的进行关联配置的别名配置中的外键字段名称,默认为配置中的目标键字段名称,默认为主键查 One-To-One 看似一对一,其实一对多.这里的 One-To-One 指的应该是查询数据(主表)结果中,关联信息是以单个形式作为一个属性挂在主表每一...

    Thanatos 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<