码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2014-11-24 06:25:55      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   使用   sp   

一、关联模型 ( RelationMondel )

1.数据查询

① HAS_ONE 查询

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

bubuko.com,布布扣

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

ArticleModel.class.php:

<?php
class 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:

<?php
class IndexAction extends Action {

        public function relation(){

        $obj=D("Article");
        $rows=$obj->field(‘id,title‘)->relation(true)->select();
        dump($rows);
    }
}

浏览器输出:

bubuko.com,布布扣
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

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

评论表:

bubuko.com,布布扣

文章表:

bubuko.com,布布扣

 

② BELONGS_TO 查询

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

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

CommentModel.class.php:

<?php
class 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 表结构

bubuko.com,布布扣

数据:

bubuko.com,布布扣

控制器 ArticleModel.class.php:

<?php
class 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

此时评论表的数据为:

bubuko.com,布布扣

模型:CommentModel.class.php:

<?php
class CommentModel extends RelationModel{

        //关联模型2 HAS_MANY
        ‘comment‘=>array(

            ‘mapping_type‘=>HAS_MANY,
            ‘foreign_key‘=>"aid",
        ),

}

控制器 ArticleModel.class.php:

<?php
class 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

显示:

bubuko.com,布布扣
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:

<?php
class 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 代码:

<?php
class ArticleModel extends AdvModel{

    //....
}

控制器代码:

<?php

class 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 )

标签:style   blog   http   io   ar   color   os   使用   sp   

原文地址:http://www.cnblogs.com/dee0912/p/4117842.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!