首页 理论教育PHPMVC开发实战:关联模型CURD案例实践

PHPMVC开发实战:关联模型CURD案例实践

【摘要】:接下来将以HAS_ONE、BELONGS_TO、HAS_MANY这3种最常见的关联模型类型作为讲解对象,深入浅出地介绍关联模型的CURD实际应用。关联查询可以使用所有Model基础模型的CURD操作方法,例如find、delete等。HAS_MANY是关联模型中最常用的操作,HAS_MANY的使用非常简单,和HAS_ONE相比,只需要修改其中的关系类型即可,其他的元素几乎不用修改。

接下来将以HAS_ONE、BELONGS_TO、HAS_MANY这3种最常见的关联模型类型作为讲解对象,深入浅出地介绍关联模型的CURD实际应用。

1.数据查询

(1)HAS_ONE查询

HAS_ONE是关联模型中最简单的一种查询方式,它适用于ONE_TO_ONE关系(即一条评论对应一篇文章)。下面继续以前面创建的tpk_article表作为数据表,演示创建一个HAS_ONE关联模型的过程。

首先创建一个评论表,并命名为tpk_comment,评论表有5个字段,其中aid字段关联tpk_article数据表中的id字段,这样就简单地创建了HAS_ONE关联模型所需要的条件,tpk_comment表结构如图7-5所示。

然后在tpk_comment表插入几条数据,需要确保aid字段中的值与tpk_article表中的id值相对应,SQL代码如下所示。

978-7-111-42852-7-Part02-233.jpg

图7-5 tpk_comment表结构

978-7-111-42852-7-Part02-234.jpg

接下来就需要使用自定义模型定义tpk_comment数据表与tpk_article数据表之间的关联关系了。打开自定义模型ArticleModel,并让模型继承于RelationModel,然后定义成员属性$_link,代码如下所示。

978-7-111-42852-7-Part02-235.jpg

978-7-111-42852-7-Part02-236.jpg

如上述代码所示,$_link属性值是一个多维关联数组,其中comment表示需要与当前模型建立关联模型的名称(即不带前缀的数据表名),$_link属性允许定义多个关联模型。comment的值为一个关联数组,其中mapping_type元素指定了该关联模型的分类(参考表7-3);其他数组元素根据类型不同而有所区别(参考表7-4),这里除了mapping_type外,还定义了class_name、mapping_name、foreign_key、mapping_fields元素,其中foreign_key是必需的。

‰ 说明:foreign_key也是一个可选项,用于指定目标数据表与当前数据表进行关联的有效字段(即外键),默认情况下系统会采用“数据对象名称_id”的形式为该元素赋值,例如关联的模型为user,那么foreign_key的值为会被设为user_id。

定义好关联属性后,接下来就可以在动作中直接使用了。调用自定义关联模型需要结合relation连贯方法,默认情况下relation方法是关闭的,需要传入true参数,关联查询才会起作用,如以下代码所示。

978-7-111-42852-7-Part02-237.jpg

关联查询可以使用所有Model基础模型的CURD操作方法,例如find、delete等。运行效果如以下代码所示。

978-7-111-42852-7-Part02-238.jpg

978-7-111-42852-7-Part02-239.jpg

如上述代码所示,由于由于评论表中只存在aid字段为7和8的数据,aid是tpk_article表的外键,所以只有id为7和8的文章有评论数据。其中comment即为关联模型中的内容,默认情况下返回二维数组,因为在HAS_ONE关系中,所有关联模型的数据都只存在一条,为了操作方便可以使用as_fields属性将二维数组结果拆分为一个单独的数组元素。打开ArticleModel,增加as_fields元素,如以下代码所示。

978-7-111-42852-7-Part02-240.jpg

如上述代码所示,由于合并后关联模型的id与当前模型的id产生冲突,所以需要使用“:”为id设置一个别名“comment_id”。定义as_fields元素后,结果集将全部合并为一个关联数组。如以下代码所示。(www.chuimin.cn)

978-7-111-42852-7-Part02-241.jpg

978-7-111-42852-7-Part02-242.jpg

(2)BELONGS_TO查询

BELONGS_TO是适用于HAS_ONE和HAS_MANY关联关系,这里继续以前面HAS_ONE示例为例,介绍BELONGS_TO的使用。前面的示例中,使用HAS_ONE演示了一条评论id对应一篇文章,那么同样一条评论数据只对应一个用户id,评论表与用户表之间的关系即为BELONGS_TO。

这样一来只需要在ComentModel自定义模型中定义user表为关联模型,然后将tpk_comment表中的comment_user字段与tpk_user表中的id字段(默认字段,不需填写)建立关联关系,那么就实现了查询tpk_comemnt表,同时得到tpk_user表数据中的用户数据(即得到评论用户名)。

首先创建自定义模型,并命名为CommentModel。让其继承于RelationModel模型,然后设置关联关系为BELONGS_TO,如以下代码所示。

978-7-111-42852-7-Part02-243.jpg

同样可以使用as_fields元素合并查询结果,这样在调用Comment自定义模型时,不仅可以查到tpk_comment表数据,还能得到tpk_user表数据。调用方式与HAS_ONE方式无异,效果如以下所示。

978-7-111-42852-7-Part02-244.jpg

(3)HAS_MANY查询

一篇文章可以对应多条评论,评论表与文章表之间的关系即为HAS_MANY。HAS_MANY是关联模型中最常用的操作,HAS_MANY的使用非常简单,和HAS_ONE相比,只需要修改其中的关系类型即可,其他的元素几乎不用修改。

当然as_fields元素只适用于单条数据,而HAS_MANY是用于查询多条数据的,所以as_fields在这里使用是没意义的。继续以前面创建的HAS_ONE示例为例,修改其中的mapping_type类型后,得到的效果正是一条新闻对应多条评论数据(前提是评论表中有多条aid重复值的评论数据)。由于HAS_MANY和HAS_ONE基本相同,在此就不做演示了。

至此,可以得到一个结论,HAS_MANY与HAS_ONE是一对取反的关联模型,HAS_ONE用于操作单条数据;HAS_MANY用于操作多条数据。

2.数据的操作

一旦定义好关联模型属性,那么之后的CURD操作都不需要做更改。接下来继续以最典型的HAS_MANY关系为例,介绍关联模型的数据操作。关联模型中创建数据是最重要的步骤,也是确保能否正确操作数据的关键,假设需要为tpk_article表添加一篇文章数据,同时为tpk_comment表增加两条评论数据,那么只需要在add数组中定义comment数组元素,然后在comment中赋值就等于为tp_comment赋值了,代码如下所示。

978-7-111-42852-7-Part02-245.jpg

如上述代码所示,其中标粗的即为关联的模型,该元素名称需要与ArticleModel自定义模型中的关联模型名称相同。

既然可以插入数据,那么更新数据也一样,只需增加where条件限制操作并将add操作改为save操作即可。接来下将介绍关联模型的数据删除。

关联删除是关联模型中最典型的应用,也是最常用的一种功能,许多大型的关系型数据库都提供这种功能,在传统的PHP与MySQL开发中,要达到这样的效果,开发人员需要使用join或者视图来实现,也可以直接在PHP代码中使用foreach等语句来实现。在ThinkPHP关联模型中,要删除数据变得非常简单,只需要将关联外键赋参给delete操作方法,即可实现关联删除。无论是哪种关联关系,都是通用的,系统会自动删除相关联的数据,如以下代码所示。

978-7-111-42852-7-Part02-246.jpg

如果只需要删除tpk_comment表中的数据(即关联模型),那么只需要为relation操作方法传入comment参数即可。