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

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.

来源:Laravel 中的 Many-To-Many

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

Laravel 中的 Many-To-Many相关推荐

  1. Laravel中Redis的配置和使用

    引入redis composer require predis/predis 会在composer.json中引入最新版本的predis composer update 把下载predis 库加入到v ...

  2. Laravel 中简约而不简单的 Macroable 宏指令

    百度百科的定义: 计算机科学里的宏(Macro),是一种批量处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是 ...

  3. 浅谈Laravel中的设计模式(四) Contract 契约模式

    阅读时长:3分钟 技术预备:熟悉Laravel的使用 契约模式(Contract) 一.首先什么是契约模式呢? 学过Java的童鞋一定知道interface.抽象类之类的概念. 主要就是为了具有相同操 ...

  4. 分享Laravel中blade页面更改没有及时显示在页面的问题解决方案

    分享Laravel中blade页面更改没有及时显示在页面的问题解决方案 参考文章: (1)分享Laravel中blade页面更改没有及时显示在页面的问题解决方案 (2)https://www.cnbl ...

  5. Laravel 中的异常处理

    Laravel 中的异常处理 参考文章: (1)Laravel 中的异常处理 (2)https://www.cnblogs.com/feiffy/p/10253842.html (3)https:// ...

  6. 关于Laravel中使用response()方法调用json()返回数据unicode编码转换的问题解决

    关于Laravel中使用response()方法调用json()返回数据unicode编码转换的问题解决 参考文章: (1)关于Laravel中使用response()方法调用json()返回数据un ...

  7. laravel中TokenMismatchException异常处理

    laravel中TokenMismatchException异常处理 参考文章: (1)laravel中TokenMismatchException异常处理 (2)https://www.cnblog ...

  8. 如何使用composer从Laravel中删除包?

    本文翻译自:How to remove a package from Laravel using composer? What is the right way to remove a package ...

  9. es中修改某个字段值_搜索引擎之laravel中使用elasticsearch(一)

    一.概述 Elasticsearch官方提供了Composer包可直接引用就好,不过要注意:如果你使用的elastcsearch不是最新的那么我建议你指定合适的版本下载,而不要采用最新的,因为不同版本 ...

最新文章

  1. Kubernetes之路 2 - 利用LXCFS提升容器资源可见性
  2. 微信“红包封面”终于开放:这样免费定制!
  3. DL框架之TensorFlow:深度学习框架TensorFlow Core(低级别TensorFlow API)的简介、安装、使用方法之详细攻略
  4. python中 5个带key内置函数
  5. [转] Vuex入门(2)—— state,mapState,...mapState对象展开符详解
  6. [Java Plasterer] Java Components 3:Java Enum
  7. Java数据类型以及变量的定义
  8. Linux 分区管理与swqp与逻辑卷创建修改删除
  9. 【博客项目】—登录功能实现( 四)
  10. C语言学习记录_2019.02.08
  11. Unity3D圣典学习【2】之CharacterController
  12. 离散数学 - 04 图论
  13. AI CC呼叫中心源码
  14. Matplotlib画热力图---heatmap(逐行注释)
  15. 方舟:生存进化官服和私服区别
  16. 计算机基本操作评课记录,《Word的基本操作》评课稿--李存业
  17. 【数值分析】复化积分公式
  18. 安卓apache php mysql_Android下安装apache、mysql、php环境
  19. 马来西亚引入中国人工智能 ,阿里云ET城市大脑为吉隆坡治堵
  20. VBA自学应用(16)——Listview控件基本操作

热门文章

  1. webhook简单部署
  2. Download the Gantt Chart Template
  3. 纯css3鼠标经过出现文字或图片鼠标移走消失
  4. 安装配置sendmail服务器
  5. Redis 桌面管理工具 RedisDesktopManager 2019.0 发布
  6. 「译」有限状态机在 CSS 动画中的应用
  7. 原 c++中map与unordered_map的区别
  8. 网络安全体系 应用学习手册 下载
  9. 爬取百度百科上中国所有城市的信息
  10. [书目]软件制胜之道:执行的策略