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还有别的关联方式,大家可以多看文档来了解。模型的操作当然也远不止这些,我的建议是,新手不管使用的什么框架,都推荐使用模型的方式来操作数据库,先不说更方便的问题,这样也能让你对面向对象有新的认识。

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

以上

相关文章
|
SQL 数据库
DM达梦数据库 - 设置忽略关键字方法,login关键字处理实例演示
DM达梦数据库 - 设置忽略关键字方法,login关键字处理实例演示
1191 0
DM达梦数据库 - 设置忽略关键字方法,login关键字处理实例演示
|
4月前
|
关系型数据库 数据库 RDS
如果源数据库和目标数据库中都存在sequence的column且在迁移过程中没有新增的话
如果源数据库和目标数据库中都存在sequence的column且在迁移过程中没有新增的话
30 1
|
9天前
|
数据库 Python
ORM映射到数据库
ORM映射到数据库。
10 1
|
4月前
|
SQL Oracle 关系型数据库
SQL CREATE INDEX 语句- 提高数据库检索效率的关键步骤
SQL CREATE INDEX 语句用于在表中创建索引。 索引用于比其他方式更快地从数据库中检索数据。用户无法看到索引,它们只是用于加速搜索/查询。 注意: 使用索引更新表比不使用索引更新表需要更多的时间(因为索引也需要更新)。因此,只在经常进行搜索的列上创建索引。
52 5
|
7月前
|
SQL NoSQL Cloud Native
数据库的类型(TP、AP、NoSQL、工具)(二)
数据库的类型(TP、AP、NoSQL、工具)(二)
731 0
|
7月前
|
SQL 存储 NoSQL
数据库的类型(TP、AP、NoSQL、工具)(一)
数据库的类型(TP、AP、NoSQL、工具)(一)
1002 0
|
9月前
|
SQL 存储 XML
数据库视频第四章(sql server 2008数据类型、对于表的管理、规则的创建与删除)
数据库视频第四章(sql server 2008数据类型、对于表的管理、规则的创建与删除)
75 0
|
10月前
|
SQL 运维 监控
记一次对DM数据库的优化过程
记一次对DM数据库的优化过程
216 0
|
存储 SQL 数据库
DM8数据库批量创建表,插入数据,更改表信息,删除测试
在测试产品的功能和性能的时候需要大量数据表,我们可以通过**游标**和**存储过程**批量创建测试表,插入测试数据,更改测试表,删除测试表。
|
数据库
【TP5.1】数据库的字段只可以读不可更新
【TP5.1】数据库的字段只可以读不可更新
65 0
【TP5.1】数据库的字段只可以读不可更新