前言:
大家在使用tp5的时候,操作数据库的方法有很多,你使用哪一种呢?我个人是比较推荐使用ORM的方式来操作数据库. 因为它更方便灵活,也更加的语义化.那么说到ORM(Obeject Relation Mapping)对象关系映射到底是什么呢?今天我就通过使用ORM来关联数据表来介绍一下
目录:
一:介绍数据表关系
二:用户表和用户详情表
三:详情表和用户表
四:用户组表和用户表
一:介绍数据表关系
现在我们这里有3张表,也是一个非常常见的表结构,用户组表,用户表,用户详情表.他们分别的字段我已经在图里列出来了
二:用户表和用户详情表
那么我现在需要通过用户id来查出用户的详细资料我们应该如何来做达到我们的目的呢?
首先我们需要了解到用户表和用户详情表之前的关系 这里需要从两个角度去判断.首先是一个用户是不是只有一个详细资料呢?然后是一个详细资料是不是只有一个所属用户呢?
这两个问题思考清楚之后我们很容易得出的结果就是,他们两个表之间的关系是一对一的关系.
确定关系后我们就需要来建立模型,建立模型这里有两个误区.那就是
模型=对应的一张数据表
模型=数据库查询
为什么说这是误区呢,因为通常我们在模型命名的时候我们会根据表名来命名.这就让很多新手认为模型就是对应的一张表.
其实模型命名的时候不和表名一样,也是可以关联起来的.只是需要多写一个配置.
其次模型的作用也不是简单的操作数据.他是一个建立在数据库访问层之上的业务层.
因为我们查询出来的数据返回的是一个对象,既然是对象,那么就会有方法.我们通过这些方法可以对查询到的数据进行进一步的操作.这里也体现出了面向对象的灵活性
好了说这么多,来介绍下实际操作
-
首先建立两个模型,一个User模型一个Profile模型
我们拿User模型举例,建立模型之后记住一定要继承tp5给我们提供的Model基类.只有继承了Model这个类才能算作是一个模型
-
分析外键位置
首先我们的需求是有了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还有别的关联方式,大家可以多看文档来了解。模型的操作当然也远不止这些,我的建议是,新手不管使用的什么框架,都推荐使用模型的方式来操作数据库,先不说更方便的问题,这样也能让你对面向对象有新的认识。
今天的介绍就这么多了。如果有错误的地方,希望大神指正,非常感谢。
以上