牛骨文教育服务平台(让学习变的简单)
博文笔记

关于thinkphp中关联模型的简单使用

创建时间:2016-11-04 投稿人: 浏览次数:151

前两天一个小项目中遇到一个问题,一个关于广告的页面,需要显示多条广告以及对应广告的评论,下面我总结了两种方法:


DROP TABLE IF EXISTS `na_ad`;
CREATE TABLE `na_ad` (
  `na_ad_id` int(11) NOT NULL AUTO_INCREMENT COMMENT "广告编号",
  `na_ad_name` varchar(100) DEFAULT NULL COMMENT "广告名字",
  `na_ad_adtype` enum("图文","视频") DEFAULT "图文" COMMENT "广告类型",
  `na_ad_showPath` varchar(255) DEFAULT NULL COMMENT "封面图片路径",
  `na_ad_type` varchar(255) DEFAULT NULL COMMENT "品牌",
  `na_ad_time` datetime DEFAULT NULL COMMENT "广告上传时间",
  `na_ad_place` varchar(255) DEFAULT NULL COMMENT "广告地区",
  `na_ad_actor` varchar(255) DEFAULT NULL COMMENT "主演名字",
  `na_ad_introduce` varchar(255) DEFAULT NULL COMMENT "影片简介",
  `na_ad_count` int(11) DEFAULT "0" COMMENT "访问量",
  `na_ad_content` text COMMENT "图文广告内容",
  `na_ad_videoPath` varchar(255) DEFAULT NULL COMMENT "视频广告存放路径",
  `na_ad_uname` varchar(11) DEFAULT NULL COMMENT "添加广告的管理员",
  `na_ad_language` varchar(255) DEFAULT NULL COMMENT "语言",
  `na_ad_daoyan` varchar(255) DEFAULT NULL COMMENT "导演",
  `na_ad_year` int(20) DEFAULT NULL COMMENT "广告年份",
  PRIMARY KEY (`na_ad_id`)
) ENGINE=InnoDB AUTO_INCREMENT=96 DEFAULT CHARSET=utf8;
广告信息:na_ad

DROP TABLE IF EXISTS `na_comment`;
CREATE TABLE `na_comment` (
  `na_comment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT "评论ID",
  `na_comment_content` text COMMENT "评论内容",
  `na_comment_time` datetime DEFAULT NULL,
  `na_comment_userId` int(11) DEFAULT NULL COMMENT "评论人ID",
  `na_comment_adId` int(11) DEFAULT NULL COMMENT "广告ID",
  `na_comment_type` enum("评论","动态") DEFAULT "评论" COMMENT "评论类型",
  PRIMARY KEY (`na_comment_id`)
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8;
评论列表:na_comment

(1)分别取出na_ad以及na_comment下面所有记录的结果集,然后再tp模板上进行处理。具体方法为 先循环输出广告信息。然后在下面通过关联字段na_comment_addId判断na_commen结果集中是否有对应na_ad_id评论的信息,然后输出。 这种方法是比较易懂的,简单、直接。但是细想不足的地方有很多,每一条广告需要遍历一次na_comment结果集,在数据量很大的情况下,会很大程度上增加数据库的负担,在执行效率上也欠缺太多。我们都知道thinkphp是基于mvc开发的,一般数据的处理我们都希望在模型层和控制层就完成,然后在view模板中渲染输出,这样的方式不管在开发过程中还是后期维护当中都是对于任何人来说整体结构都是清晰的,下面讲一下第二种方法,thinkphp中的关联模型。


(2)就拿上面那个实例来说,我们最希望看到的是评论信息作为以子结果集在na_ad的结果集中出现,这样我们就不用在做过多的处理,只需要渲染输出即可。在thinkphp中定义了关联模型。ThinkPHP可以很轻松的完成数据表的关联CURD操作,目前支持的关联关系包括四种:HAS_ONEBELONGS_TOHAS_MANYMANY_TO_MANY。而我们上面实例中用到的是第三种,has_many。在模型中,使用$_link进行关联定义,要使用关联操作,模型必须继承ModelRelationModel类。下面看一下实际使用方法。我们在AdModel中定义关联(one to many,我们通常都在one中定义关联),具体定义为:

class AdModel extends RelationModel
{
      protected $_link = array(
            "Comment"=>array(
                  "mapping_type" =>self::HAS_MANY,
                  "class_name"   =>"Comment",
                  "foreign_key"  =>"na_comment_adId",
                  "mapping_fields" =>"na_comment_content,na_comment_time",
                  "mapping_order"  =>"na_comment_time desc",
                  "condition"      =>"na_comment_type="评论"",
            ),
      );
其中‘Comment’表示 关联名,这个一般以关联模型类类名命名(只是方便区分不同关联,其他名字也可以),mapping_type表示关联类型,class_name表示关联模型类类名(comment模型类可以不做定义,有tp框架中定义的model基类),foreign_key表示关联字段名,mapping_order表示按字段排序,condition是附加条件(关于关联字段,tp会自动匹配与其对应的主表字段,不用在条件中做叙述)。在取数据时,我们只需要使用下面代码即可:

$this->relation("Comment")->select();
var_dump后的打印结果为:

 

 最后说一下thinkphp这个框架吧,它对于很多初学者来说也很容易上手。它很大程度的提高了我们的开发速度,但我觉得对于一个初学者来说,这个框架的最大意义在于底层那些方法的封装上很值得我们学习,那种编程思想才是最大的财富.....

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。