TP5ORM操作数据库,关联篇

简介: 前言:大家在使用tp5的时候,操作数据库的方法有很多,你使用哪一种呢?我个人是比较推荐使用ORM的方式来操作数据库. 因为它更方便灵活,也更加的语义化.

前言:

大家在使用tp5的时候,操作数据库的方法有很多,你使用哪一种呢?我个人是比较推荐使用ORM的方式来操作数据库. 因为它更方便灵活,也更加的语义化.那么说到ORM(Obeject Relation Mapping)对象关系映射到底是什么呢?今天我就通过使用ORM来关联数据表来介绍一下

目录:

一:介绍数据表关系
二:用户表和用户详情表
三:详情表和用户表
四:用户组表和用户表

一:介绍数据表关系
表关系图

现在我们这里有3张表,也是一个非常常见的表结构,用户组表,用户表,用户详情表.他们分别的字段我已经在图里列出来了

二:用户表和用户详情表

那么我现在需要通过用户id来查出用户的详细资料我们应该如何来做达到我们的目的呢?

首先我们需要了解到用户表和用户详情表之前的关系 这里需要从两个角度去判断.首先是一个用户是不是只有一个详细资料呢?然后是一个详细资料是不是只有一个所属用户呢?

这两个问题思考清楚之后我们很容易得出的结果就是,他们两个表之间的关系是一对一的关系.

确定关系后我们就需要来建立模型,建立模型这里有两个误区.那就是
模型=对应的一张数据表
模型=数据库查询

为什么说这是误区呢,因为通常我们在模型命名的时候我们会根据表名来命名.这就让很多新手认为模型就是对应的一张表.
其实模型命名的时候不和表名一样,也是可以关联起来的.只是需要多写一个配置.
其次模型的作用也不是简单的操作数据.他是一个建立在数据库访问层之上的业务层.
因为我们查询出来的数据返回的是一个对象,既然是对象,那么就会有方法.我们通过这些方法可以对查询到的数据进行进一步的操作.这里也体现出了面向对象的灵活性

好了说这么多,来介绍下实际操作

  1. 首先建立两个模型,一个User模型一个Profile模型


    User模型

    我们拿User模型举例,建立模型之后记住一定要继承tp5给我们提供的Model基类.只有继承了Model这个类才能算作是一个模型

  2. 分析外键位置
    首先我们的需求是有了User表中的id,想查出这个user中的数据和他的详细数据.那么我们就在User模型中操作.那么,在这两个表中,他们是通过profile表中的user_id这个外键关联起来的对吧
    那么从user表的角度来说,就是外键不在自己的表内部.这个时候我们就可以把User表看作是主表,把profile看作是User表的从表.而且之前分析过的,他们是一对一的关系.这时候我们根据手册我们知道我们应该使用hasOne方法来关联他们


    关联

就这样就关联好了.而且这个操作非常的语义化,也体现出了tp开发团队的能力,(我把我理解的意思写在图片里了)
那么这样

那么关联好了之后我们来写一个调用查询的方法

 public static function getUser($id)
    {
        return self::with('profile')->find($id);
    }

我们使用with方法将我们的关联方法名传进去,可以传字符串也可以传数组,如果有多个关联的话就使用数据就好了.
好了,这样一来,控制器每次需要查询一个用户的所有数据就只需要调用getUser方法就可以了,就不用考虑关联的事情了.这也是使用ORM来操作数据的优势.那就是一次确定关系后,以后就直接调用就好了,非常的面向对象

三,详情表和用户表

之前呢,是一个比较简单的业务逻辑,现在我提出一个稍微复杂一点的业务.那就是通过profile表的id,查询用户密码.
这里我们因为之前分析过他们两个表是一对一的关系和外键关系,那么我们就直接来看代码

关联

这里我们使用belongsTo方法来关联.同样的这里也非常的语义化,我把我理解的意思写在里面了

关联好了之后我们来进行写实现的方法

    public static function getPasswordById($id)
    {
        return self::with('user')->field('password')->find($id);
    }

代码和思路都很类似,只是多了一个field方法来查询特定的字段而已.

四:用户组表和用户表

通常呢我们都会给用户分组的,比如安等级分组,安付费还是没付费分组等等.那么现在我的需求是查询用户组1的有哪些用户

这里的情况就跟刚才的一对一关系有些不同了.首先我们来分析,一个用户组只能有一个用户吗?显然不是,那么一个用户只能所属一个分组吗?目前看的表关系是这样。(如果是一个用户属于多个用户组,则靠外键实现就很不优雅,通常使用第三张关系表来关联)

确定关系后,我们那么用户组表和用户表之间是一个一对多的关系,那么我们再看看,外键是在哪一张表呢?很明显外键存在user表中,那么外键就不在user_group表中。所以和刚才的user表类似我们使用hasMany方法

关连

就这样关联起来了。那么 我们再看看业务如何实现

    public static function getUsersById($id)
    {
        return self::with('user')->select($id);
    }

对于多条数据,我们使用select方法来查询

好了,今天就介绍这些,比较典型的关联方式,当然tp5还有别的关联方式,大家可以多看文档来了解。模型的操作当然也远不止这些,我的建议是,新手不管使用的什么框架,都推荐使用模型的方式来操作数据库,先不说更方便的问题,这样也能让你对面向对象有新的认识。

今天的介绍就这么多了。如果有错误的地方,希望大神指正,非常感谢。

以上

相关文章
|
5月前
|
关系型数据库 数据库 RDS
如果源数据库和目标数据库中都存在sequence的column且在迁移过程中没有新增的话
如果源数据库和目标数据库中都存在sequence的column且在迁移过程中没有新增的话
44 1
|
2月前
|
SQL 数据挖掘 数据库
数据库join类型有哪些?
【8月更文挑战第2天】
121 17
数据库join类型有哪些?
|
3月前
|
SQL 数据库 Python
Django框架数据库ORM查询操作(6)
【7月更文挑战第6天】```markdown Django ORM常用数据库操作:1) 查询所有数据2) 根据ID查询 3) 精确查询 4) 分页排序
60 1
|
4月前
|
SQL 安全 数据库
数据库||数据定义
数据库||数据定义
|
5月前
|
数据库 Python
ORM映射到数据库
ORM映射到数据库。
30 1
|
5月前
|
存储 关系型数据库 MySQL
{MySQL} 数据库约束& 表的关系& 新增&&删除& 修改& 查询
{MySQL} 数据库约束& 表的关系& 新增&&删除& 修改& 查询
43 0
|
SQL 数据库 数据库管理
数据库|数据库之定义删除修改基本表
数据库|数据库之定义删除修改基本表
112 1
|
SQL 存储 XML
数据库视频第四章(sql server 2008数据类型、对于表的管理、规则的创建与删除)
数据库视频第四章(sql server 2008数据类型、对于表的管理、规则的创建与删除)
94 0
|
SQL 缓存 搜索推荐
Gorm学习(三)基础:迁移(数据库建表以及字段设置)
在项目开发中,我们可能会随时调整声明的模型,比如添加字段和索引,使用 GORM 的自动迁移功能,可以始终让我们的数据库表结构保持最新。
1124 0
Gorm学习(三)基础:迁移(数据库建表以及字段设置)
|
SQL 数据库
数据库实验一:数据库与数据表定义(2)—— 数据表相关操作
使用T-SQL命令方法创建自定义数据类型myName2为Nvarchar(20),不允许为空;自定义数据类型myDept为char(50),允许为空。(提示:CREATE TYPE…FROM命令)
325 0
数据库实验一:数据库与数据表定义(2)—— 数据表相关操作