博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Laravel 中的 Many-To-Many
阅读量:6867 次
发布时间:2019-06-26

本文共 1923 字,大约阅读时间需要 6 分钟。

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

One-To-One //一对一One-To-Many //一对多Many-To-Many //多对多

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

User-To-Profile // One-To-OneUser-To-Articles // One-To-ManyArticles-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中:

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

Tag.php中:

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

这里注意两点:

  1. 你可以在声明关系的时候指定外键,如

$this->belongsToMany('App\Article','foreign_key', 'other_key');
  1. 如果在 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.

 

来源:

转载于:https://www.cnblogs.com/lamp01/p/8443361.html

你可能感兴趣的文章
spark能传递外部命名参数给main函数吗?
查看>>
[LeetCode] Convex Polygon 凸多边形
查看>>
递归神经网络
查看>>
iframe父页面和子页面相互调用的方法
查看>>
【批处理学习笔记】第十七课:截取字符串
查看>>
[Erlang 0066] Erlang orddict
查看>>
Hadoop HDFS 用户指南
查看>>
体验mssql-cli
查看>>
ASP.NET MVC之国际化(十一)
查看>>
Swift析构器
查看>>
★路由递归查询方法及相关图…
查看>>
SpringMvc入门
查看>>
scrapy 登录
查看>>
上海往事之看房子
查看>>
SQL Server使用规范
查看>>
高性能mysql主存架构
查看>>
《Programming WPF》翻译 第7章 3.笔刷和钢笔
查看>>
[20160906]修改口令在内存中.txt
查看>>
解剖SQLSERVER 第九篇 OrcaMDF现在能通过系统DMVs显示元数据(译)
查看>>
基于.net开发chrome核心浏览器【六】
查看>>