多对多关系也是很常用的一种关系,比如一篇文章可以有多个标签,一个标签下也可以有多篇文章,这就是一个典型的多对多的关系。


1 实现多对多关系

多对多关系我们需要三张表,一张是文章另一张是标签,第三章表是它们的中间表 因为多对多关系需要抽离成两个一对多关系嘛。

1.1 文章结构

    public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('body');
$table->integer('comment_count')->default(0);
$table->timestamps();
});
}

1.2 标签结构

    public function up()
{
Schema::create('tags', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->text('content');
$table->timestamps();
});
}

1.3 中间表结构

    public function up()
{
Schema::create('article_tag', function (Blueprint $table) {
$table->increments('id');
$table->integer('article_id');
$table->integer('tag_id');
});
}

2 编写关系

2.1 Article

首先我们看看文章模型中的方法:

    public function tags()
{
/**
* (其实 我们只需要写第一个参数就OK了)
* 第二个参数:中间表名 如果不是article_tag的话 必须指定该参数。
* 第三个参数:外键 如果中间表中不是article_id 必须指定该参数。
* 第四个参数:关联到那个外键 如果不是tag_id 必须指定该参数。
*/
return $this->belongsToMany(Tag::class, 'article_tag', 'article_id', 'tag_id');
// return $this->belongsToMany(Tag::class, 'article_tag');
}

然后展示:

Route::get('/', function () {
$article = \App\Article::find(16);
foreach ($article->tags as $tag) {
echo $tag->name . " : " . $tag->content;
echo '<hr />';
}
});

2.2 Tag

Tag模型的编写跟Article模型一模一样。

    public function articles()
{
/**
* 可以完全省略后面的参数。
* return $this->belongsToMany(Article::class);
*/
return $this->belongsToMany(Article::class, 'article_tag', 'tag_id', 'article_id');
}

展示:

Route::get('/', function () {
$tag = \App\Tag::find(7);
foreach ($tag->articles as $article) {
echo $article->title . " : " . $article->body;
echo '<hr />';
}
});

最新文章

  1. JavaScript面向对象与原型
  2. java AES 加密与解密
  3. PHP批量删除做法
  4. js中判断输入的数字是否是数值类型
  5. dex和odex相互转换
  6. Remote验证及其改进(附源码)
  7. 1.4.2. 实现 Core Data Helper 类(Core Data 应用程序实践指南)
  8. HDU 6043 KazaQ&#39;s Socks (规律)
  9. 利用kibana插件对Elasticsearch进行bool查询
  10. Django model对象接口
  11. ext图片预览功能实现,前端代码
  12. css Margin-top塌陷,解决方法
  13. c#中可变参数(params关键字的使用)
  14. Python-ccs高级选择器 盒模型
  15. MySQL&amp;MyBatis 时间处理的配合
  16. post processing
  17. s[-1]和s[len(s)-1]
  18. UED、UCD、UE、UI、交互设计概念
  19. 【算法笔记】B1020 月饼
  20. linux设置开机自动进入命令模式

热门文章

  1. vue1.0 的过滤器
  2. 关于comet
  3. Android 6.0 超级简单的权限申请 (Permission)
  4. Idea golang &quot;can’t find import&quot; 解决方法
  5. Python 多行注释
  6. java基础讲解05-----流程控制语句
  7. unity, access sprite of UGUI Image
  8. 点滴积累【C#】---将Excel数据导入到数据库
  9. 点滴积累【C#】---操作xml,将xml数据显示到treeview
  10. Java Web框架play framework的下载与环境变量配置