Laravel5.1 模型 --多对多关系

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


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 />‘;
    }
});
时间: 2024-10-18 05:41:27

Laravel5.1 模型 --多对多关系的相关文章

jango 模型管理数据model,数据库外键主键与一对一,一对多,多对多关系

四.models.py 定义和管理模型: 4.1模型class的属性就映射与数据库的字段参数 继承models.Model class TestClass(models.Model): 4.2在数据库生成数据表: #django默认在makemigrations会为表对象创建主键id,id = models.AutoField(primary_key=True) 你也可以自定义一个主键对象: 4.2.1: 生成迁移文件python manage.py makemigrations 4.2.2执行

Flask框架之多对多关系模型类的定义

案例代码: table_relation = db.Table('stu_tea_rel', # 关系表明 db.Column('stu_id', db.Integer, db.ForeignKey('student.id')), # 多关系表的主键 db.Column('tea_id', db.Integer, db.ForeignKey('teacher.id'))) # 多关系表的主键 class Student(db.Model): id = db.Column(db.Integer,

Laravel5.1 模型 --一对一关系

这篇文章主要记录模型的一对一关系,关联关系是Model的一种非常方便的功能. 1 实现一对一关系 1.1 准备工作 首先我们需要创建两张表和对应的两个模型,第一个模型是用户表,第二个模型是账号表. 这里 我们的逻辑是:一个用户信息下只能有一个账号,一个账号只能被一个用户所拥有,这就是一对一关系. 1.1.1 用户信息表 生成模型和迁移文件: php artisan make:model UserInfo -m 编写迁移文件(表规格): public function up() { Schema:

ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片:多对多关系(上)

这章介绍了怎样创建一个新的实体来管理图片,怎样使用HTML窗体来上传图片文件和使用多对多关系来使它们与产品相关,并且怎样来保存图片到文件系统中.这章也介绍了更多复杂的错误处理增加客户端错误到模型中为了把它们显示回给用户.在这章中播种数据库使用的产品图片可能在在第六章的从Apress网页站点下载代码中. 注意:如果你想遵从这章的代码,你必须完成第五章的代码或者从www.apress.com下载第五章的源代码作为一个起点. 创建实体保存图片文件名 这个项目,我们正要使用文件系统在Web项目中存储图片

深入浅出Hibernate(二)多对一关系映射

学习Hibernate是为了更方便的操作数据库,在数据库中的关系模型中存在多对一的关系,比如下图所示的员工和部门之间的关系,那么这种关系在Hibernate中如何映射呢?让我用一个小Demo来详细讲解. 建立映射分为以下几步: 1.设计domain对象Department.Employee,代码如下: package cn.itcast.hibernate.domain; public class Department { private int id; private String name;

Hibernate中一对多和多对一关系

1.单向多对一和双向多对一的区别? 只需要从一方获取另一方的数据时 就使用单向关联双方都需要获取对方数据时 就使用双向关系 部门--人员 使用人员时如果只需要获取对应部门信息(user.getdeptarment())不需要 从部门下的人员信息时,就配置成单向 多对一 使用部门时如果只需要获取部门下人员信息(deptartmanet.getusers())不需要 从人员获取部门信息时,就配置成单向 一对多 既要获取部门下人员 deptartmanet.getusers()又要从人员获取部门信息

《Entity Framework 6 Recipes》翻译系列 (5) -----第二章 实体数据建模基础之有载荷和无载荷的多对多关系建模 (转)

2-3 无载荷(with NO Payload)的多对多关系建模 问题 在数据库中,存在通过一张链接表来关联两张表的情况.链接表仅包含连接两张表形成多对多关系的外键,你需要把这两张多对多关系的表导入到实体框架模型中. 解决方案 我们设想,你数据库中的表与图2-10一样. 图2-10 艺术家和专辑多对多关系 按下面的步骤将这些表和关系导入到模型中: 1.右键你的项目,选择Add(增加) ?New Item(新建项),然后选择Visual C#条目下的Data模板下的ADO.NET Entity D

Entity Framework 6 Recipes 2nd Edition(10-9)译 -&gt; 在多对多关系中为插入和删除使用存储过程

10-9. 在多对多关系中为插入和删除使用存储过程 问题 想要在一个无载荷的多对多关系中使用存储过程(存储过程只影响关系的连接表) 解决方案 假设有一个多对多关系的作者( Author)表和书籍( Book)表. 用连接表AuthorBook来做多对多关系,如 Figure 10-11.所示: Figure 10-11. A payload-free, many-to-many relationship between an Author and a Book 当把表生成模型,那么模型就如Fig

用NHibernate处理带属性的多对多关系

1.引言 老谭在面试开发人员的时候,为了考察他们的数据库开发能力,常常祭出我的法宝,就是大学数据库教程中讲到的一个模式:学生选课.这个模式是这样的: 在这个模式中,学生(Student)和课程(Course)都是实体,分别有主键Id.考试成绩(Score)是学生和课程之间的多对多关系. 基于这个模式,对于新手,可以出一些简单查询要求,对于熟手,可以出一些复杂的查询要求,用起来得心应手. 但今天要说的重点是,怎么用NHibernate实现这个模式.和一般多对多关系稍有不同的是,这个关系带有一个属性