首页 > 代码库 > ThinkPHP 学习笔记 ( 四 ) 数据库操作之关联模型 ( RelationMondel ) 和高级模型 ( AdvModel )

ThinkPHP 学习笔记 ( 四 ) 数据库操作之关联模型 ( RelationMondel ) 和高级模型 ( AdvModel )

一、关联模型 ( RelationMondel )

1.数据查询

① HAS_ONE 查询

创建两张数据表评论表和文章表: tpk_comment , tpk_article 。评论和文章的对应关系为,一条评论 id 对应一篇文章,为 ONE_TO_ONE 关系 ( 一对一 )。评论表的结构为:

其中 aid 字段与文章表的 id 字段对应。打开自定义模型 ArticleModel,让模型继承于 RelationModel,然后定义成员属性 $_link,代码:

ArticleModel.class.php:

<?phpclass ArticleModel extends RelationModel{        protected $_link = array(        //关联模型(表)1        ‘comment‘=>array(        //元素(属性)定义        ‘mapping_type‘=>HAS_ONE,        ‘class_name‘=>"comment",                     
"mapping_name"=>"comment", "foreign_key"=>"aid", "mapping_fields"=>array("id","comment","comment_time"),
"as_fields"=>"id:comment_id,comment,comment_time", ),}

foreign_key 为必须的。

控制器:IndexAction.class.php:

<?phpclass IndexAction extends Action {        public function relation(){        $obj=D("Article");        $rows=$obj->field(‘id,title‘)->relation(true)->select();        dump($rows);    }}

浏览器输出:

array(6) {  [0] => array(5) {    ["id"] => string(1) "1"    ["title"] => string(4) "test"    ["comment_id"] => string(1) "1"    ["comment"] => string(15) "第一条评论"    ["comment_time"] => string(19) "2014-11-22 22:40:01"  }  [1] => array(5) {    ["id"] => string(1) "2"    ["title"] => string(12) "吼吼吼吼"    ["comment_id"] => string(1) "2"    ["comment"] => string(15) "第二条评论"    ["comment_time"] => string(19) "2014-11-22 22:40:06"  }  [2] => array(5) {    ["id"] => string(1) "4"    ["title"] => string(7) "test2_m"    ["comment_id"] => NULL    ["comment"] => NULL    ["comment_time"] => NULL  }  [3] => array(5) {    ["id"] => string(1) "5"    ["title"] => string(2) "22"    ["comment_id"] => NULL    ["comment"] => NULL    ["comment_time"] => NULL  }  [4] => array(5) {    ["id"] => string(1) "6"    ["title"] => string(1) "1"    ["comment_id"] => NULL    ["comment"] => NULL    ["comment_time"] => NULL  }  [5] => array(5) {    ["id"] => string(1) "7"    ["title"] => string(6) "lalala"    ["comment_id"] => NULL    ["comment"] => NULL    ["comment_time"] => NULL  }}
http://127.0.0.26/index.php/index/relation

此时文章表和评论表的数据为:

评论表:

文章表:

 

② BELONGS_TO 查询

一条评论数据对应一个用户 id,评论表和用户表之间的关系是 BELONGS_TO

创建自定义模型 CommentModel,继承于RelationModel:

CommentModel.class.php:

<?phpclass CommentModel extends RelationModel{    protected $_link = array(        ‘user‘=>array(            "mapping_type"=>BELONGS_TO,            "foreign_key"=>"comment_user",            "mapping_fields"=>array("id","username"),            "as_fields"=>"id:user_id,username",        ),    );}

tpk_user 表结构

数据:

控制器 ArticleModel.class.php:

<?phpclass IndexAction extends Action {    //BELONGS_TO    public function relation2(){        $obj=D("Comment");        $rows=$obj->relation(true)->select();        dump($rows);    }}

访问 http://127.0.0.26/index.php/index/relation2

显示:

array(2) {  [0] => array(7) {    ["id"] => string(1) "1"    ["aid"] => string(1) "1"    ["comment"] => string(15) "第一条评论"    ["comment_time"] => string(19) "2014-11-22 22:40:01"    ["comment_user"] => string(1) "1"    ["user_id"] => string(1) "1"    ["username"] => string(3) "dee"  }  [1] => array(7) {    ["id"] => string(1) "2"    ["aid"] => string(1) "2"    ["comment"] => string(15) "第二条评论"    ["comment_time"] => string(19) "2014-11-22 22:40:06"    ["comment_user"] => string(1) "2"    ["user_id"] => string(1) "2"    ["username"] => string(4) "yoko"  }}

 

③ HAS_MANY

一篇文章可以对应多条评论,评论表和文章表之间的关系为 HAS_MANY

此时评论表的数据为:

模型:CommentModel.class.php:

<?phpclass CommentModel extends RelationModel{        //关联模型2 HAS_MANY        ‘comment‘=>array(            ‘mapping_type‘=>HAS_MANY,            ‘foreign_key‘=>"aid",        ),}

控制器 ArticleModel.class.php:

<?phpclass IndexAction extends Action {    //HAS_MANY    public function relation3(){        $obj=D("Article");        $rows=$obj->relation(true)->select();        dump($rows);    }}

访问 http://127.0.0.26/index.php/index/relation3

显示:

array(6) {  [0] => array(8) {    ["id"] => string(1) "1"    ["title"] => string(4) "test"    ["content"] => string(12) "test_content"    ["category"] => string(13) "test_category"    ["area"] => string(6) "北京"    ["add_user"] => string(5) "admin"    ["add_time"] => string(19) "2014-11-20 23:03:44"    ["comment"] => array(2) {      [0] => array(5) {        ["id"] => string(1) "1"        ["aid"] => string(1) "1"        ["comment"] => string(15) "第一条评论"        ["comment_time"] => string(19) "2014-11-22 22:40:01"        ["comment_user"] => string(1) "1"      }      [1] => array(5) {        ["id"] => string(1) "2"        ["aid"] => string(1) "1"        ["comment"] => string(15) "第二条评论"        ["comment_time"] => string(19) "2014-11-22 22:40:06"        ["comment_user"] => string(1) "2"      }    }  }  [1] => array(8) {    ["id"] => string(1) "2"    ["title"] => string(12) "吼吼吼吼"    ["content"] => string(18) "任溶溶柔然人"    ["category"] => string(14) "test_category2"    ["area"] => string(6) "河北"    ["add_user"] => string(5) "admin"    ["add_time"] => string(19) "2014-11-22 15:16:12"    ["comment"] => NULL  }  [2] => array(8) {    ["id"] => string(1) "4"    ["title"] => string(7) "test2_m"    ["content"] => string(4) "haha"    ["category"] => string(0) ""    ["area"] => string(6) "福建"    ["add_user"] => NULL    ["add_time"] => string(19) "2014-11-22 11:44:26"    ["comment"] => NULL  }  [3] => array(8) {    ["id"] => string(1) "5"    ["title"] => string(2) "22"    ["content"] => NULL    ["category"] => string(0) ""    ["area"] => string(6) "福建"    ["add_user"] => NULL    ["add_time"] => string(19) "2014-11-22 12:40:58"    ["comment"] => NULL  }  [4] => array(8) {    ["id"] => string(1) "6"    ["title"] => string(1) "1"    ["content"] => string(1) "2"    ["category"] => string(0) ""    ["area"] => string(6) "福建"    ["add_user"] => NULL    ["add_time"] => NULL    ["comment"] => NULL  }  [5] => array(8) {    ["id"] => string(1) "7"    ["title"] => string(6) "lalala"    ["content"] => string(6) "hohoho"    ["category"] => string(0) ""    ["area"] => string(6) "北京"    ["add_user"] => NULL    ["add_time"] => NULL    ["comment"] => NULL  }}
View Code

 

2.数据操作

以 HAS_MANY 为例,在tpk_article中添加一篇文章,同时 tpk_comment 中添加两条评论。代码:

控制器 ArticleModel.class.php:

    //HAS_MANY 操作,tpk_article中添加一篇文章,同时tpk_comment中添加两条评论    public function reladd(){        $obj=D("Article");        $data[‘title‘]="新闻标题";        $data[‘content‘]=‘这是一条体育新闻‘;        $data[‘add_time‘]=date("Y-m-d H:i:s",time());        //关联的模型        $data[‘comment‘]=array(            array("aid"=>20,"comment"=>"体育新闻评论1","comment_time"=>date("Y-m-d H:i:s",time()),"comment_user"=>1),            array("aid"=>20,"comment"=>"体育新闻评论2","comment_time"=>date("Y-m-d H:i:s",time()),"comment_user"=>1),        );        $obj->relation(true)->add($data);    }

另一个例子,删除文章的同时也删除了评论:

控制器 IndexAction.class.php:

<?phpclass IndexAction extends Action {        //HAS_MANY 删除    public function reldel(){        $obj=D("Article");        $obj->relation(true)->delete(20);        echo $obj->getLastSql();    }}

 

二、高级模型 ( AdvModel )

高级模型除了可以实现普通模型所有功能之外,还能够实现数据过滤、操作限制、延迟操作等功能。

例子:

定位查询 getN() , first , last

getN(2) :获取结果集正序第 3 条记录

Model 代码:

<?phpclass ArticleModel extends AdvModel{    //....}

控制器代码:

<?phpclass IndexAction extends Action {        //使用高级模型定位查询//        $obj=D("Article");//        $rows=$obj->getN(2);//        dump($rows);//        echo $obj->getLastSql();        //使用高级模型动态查询//        $obj=D("Article");//        $rows=$obj->getByArea("北京");//        dump($rows);//        echo $obj->getLastSql();        //使用高级模型动态查询2//        $obj=D("Article");//        $rows=$obj->getFieldByArea("北京","id");//        dump($rows);//        echo $obj->getLastSql();        //使用高级模型动态查询3//        $obj=D("Article");//        $rows=$obj->top5();//        dump($rows);//        echo $obj->getLastSql();    }}

 

参考资料:《PHP MVC 开发实战》

 

ThinkPHP 学习笔记 ( 四 ) 数据库操作之关联模型 ( RelationMondel ) 和高级模型 ( AdvModel )