ThinkPHP 3.2.3 关联模型的使用

关于关联模型

ThinkPHP 3.2.3 的关联模型(手册地址)一般处理关联数据表的 CURD 操作,例如关联读取、关联写入、关联删除等。

 

 

实例

博客管理模块关于博客有 4 张数据表:博客表 crm_blog:

CREATE TABLE `crm_blog` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`title` varchar(30) NOT NULL DEFAULT '',`content` text NOT NULL,`time` int(10) unsigned NOT NULL DEFAULT '0',`click` smallint(6) unsigned NOT NULL DEFAULT '0',`cid` int(10) unsigned NOT NULL,`del` tinyint(1) unsigned NOT NULL DEFAULT '0',PRIMARY KEY (`id`),KEY `cid` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

 

属性表 crm_attr:

CREATE TABLE `crm_attr` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` char(10) NOT NULL DEFAULT '',`color` char(10) NOT NULL DEFAULT '',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

 

博客-属性关联表 crm_blog_attr:

 CREATE TABLE `crm_blog_attr` (`bid` int(10) unsigned NOT NULL,`aid` int(10) unsigned NOT NULL,KEY `bid` (`bid`),KEY `aid` (`aid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

博客和属性是多对多的关系(MANY_TO_MANY)

 

类别表 crm_cate:

CREATE TABLE `crm_cate` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` char(20) NOT NULL DEFAULT '',`pid` int(10) unsigned NOT NULL DEFAULT '0',`sort` smallint(6) NOT NULL DEFAULT '100',PRIMARY KEY (`id`),KEY `pid` (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8

博客相对于类别是一对多(BELONGS_TO)关系,另一个角度类别相对于博客是多对一(HAS_MANY)关系

 

在 Admin 应用下创建 Model 类:./Application/Admin/Model/BlogRelationModel.class.php:

 1 <?php
 2 namespace Admin\Model;
 3 use Think\Model\RelationModel;
 4 
 5 class BlogRelationModel extends RelationModel {
 6     //如果Model文件名是BlogModel.class.php 就不需要定义$tableName
 7     protected $tableName = 'blog';//以blog表为基准表
 8     protected $_link = array(
 9         'attr'=>array(
10             'mapping_name'=>'attr',
11             'mapping_type'=>self::MANY_TO_MANY,//多对多关系
12             'foreign_key'=>'bid',//中间表中blog的id
13             'relation_foreign_key'=>'aid',//中间表中attr的id
14             'relation_table'=>'crm_blog_attr'
15         ),//定义关联表
16         'cate'=>array( //博文和属性 一对多关系
17             'mapping_name'=>'cate',
18             'mapping_type'=>self::BELONGS_TO,//多(cate)关联一(blog)用 HAS_MANY,一(blog)关联多(cate)用BELONGS_TO
19             'foreign_key'=>id, //blog表中的博文id
20             'mapping_fields'=>'name', //只读取name字段
21             'as_fields'=>'name:cate' //把cate表的name字段取出作为主表blod的字段展示并且把name改成cate(避免字段重复)
22         )
23     );
24     
25     //获取博文列表(包括没有删除的博文和回收站的博文,通过参数$type区分)
26     public function get_blogs($type = 0) { //默认是没有删除的博文
27         $field = array('cid','del');
28         $where = array('del'=>$type);
29         return $this->field($field,true)->relation(array('cate','attr'))->where($where)->select();
30     }
31 }

说明:

Line 7:如果 Model 类的文件名是 BlogModel.class.php ,则不需要定义 protected $tableName = 'blog',否则要加上定义,因为实例化 Model 类时找不到 blogrelation 表,只有 blog 表

 

实例化 Model 类

控制器 ./Application/Admin/Controller/BlogController.class.php :

  1 <?php
  2 namespace Admin\Controller;
  3 use Admin\Common\Category;
  4 
  5 class BlogController extends CommonController{
  6     //博文列表
  7     public function index() {
  8         $this->blog = D('BlogRelation')->get_blogs();
  9         $this->display();
 10     }
 11     
 12     //添加博文
 13     public function add_blog() {
 14         //博文分类
 15         $cate = M('cate')->order('sort')->select();
 16         $this->cate = Category::level($cate);//一维数组无限极分类
 17 
 18         //博文属性
 19         $this->attr = M('attr')->select();
 20         
 21         $this->display();
 22     }
 23     
 24     //添加博文表单处理
 25    public function add_blog_handle() {
 26         //echo '<pre>';print_r($_POST);
 27         $data = array(
 28             'title'=>I('title'),
 29             'content'=>I('content'),
 30             'time'=>time(),
 31             'click'=>I('click', 0, 'int'),
 32             'cid'=>I('cid'),
 33         );
 34         
 35         //属性插入到博文-属性中间表 开始
 36         /*if(isset($_POST['aid'])) {
 37             foreach($_POST['aid'] as $v) {
 38                 $data['attr'][] = $v;//attr:关联表名称
 39             }
 40         }*/
 41         
 42         /*D('BlogRelation')->relation(true)->add($data);*/
 43         //$this->display('blog');//用于查看trace信息(config.php定义)
 44         //属性插入到博文-属性中间表 结束
 45         
 46         //自定义插入关联表(不使用关联模型)开始,哪种方法都可以
 47         if($bid = M('blog')->add($data)) {
 48             if(isset($_POST['aid'])) {
 49                 $sql = 'INSERT INTO `'.C('DB_PREFIX').'blog_attr` (bid,aid) VALUES ';
 50                 foreach($_POST['aid'] as $v) {
 51                     $sql .= '('.$bid.','.$v.'),';
 52                 }
 53                 $sql = rtrim($sql,',');
 54                 M()->execute($sql);
 55             }
 56             $this->success('添加成功', U('Admin/Blog/index'));
 57         } else {
 58             $this->error('添加失败');
 59         }
 60         //自定义插入关联表(不使用关联模型)结束
 61         
 62     }
 63     
 64     
 65     //删除到回收站/还原
 66     public function to_recycle_bin () {
 67         $id = (int)$_GET['id'];
 68         $type = (int)$_GET['type'];
 69         $update = array(
 70             'id'=>$id,
 71             'del'=>$type
 72         );
 73         $msg = $type ? '删除' : '还原';
 74         $location = $type ? U('Admin/Blog/index','','') : U('Admin/Blog/recycle_bin','','');
 75         if(M('blog')->save($update)) {
 76             $this->success($msg.'成功' ,$location);
 77         } else {
 78             $this->error($msg.'失败');
 79         }
 80     }
 81     
 82     //回收站
 83     public function recycle_bin() {
 84         $this->blog = D('BlogRelation')->get_blogs(1);
 85         $this->display('index');
 86     }  
 87     
 88     //彻底删除
 89     public function delete() {
 90         $id = (int)$_GET['id'];
 91         //使用关联模型删除 或 手动删除
 92         if(D('BlogRelation')->relation('attr')->delete($id)) {
 93             $this->success('删除成功',U('Admin/Blog/recycle_bin'));
 94         } else {
 95             $this->error('删除失败');
 96         }        
 97     }
 98     
 99     //清空回收站
100 }

 

转载于:https://www.cnblogs.com/dee0912/p/5189740.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/418979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js 获取元素

putArrdocument.getElementsByClassName() ()(“input的class名称”); putArrdocument.getElementById()(“input的id”); putArrdocument.getElementsByName(“input的名称”); var aLi document.getElementsByTagName(‘Li’);

CSS布局方法

1. 两列布局 &#xff08;1&#xff09;第一种方法&#xff1a; html: 1 <div id"Lbar"></div> 2 <div id"Rbar"></div> css: 1 #Lbar{height: 600px;width:200px;background: red;float: left;} 2 #Rbar{height: 600px;width: 60…

Springcloud整理

Springcloud 答题技巧&#xff1a; 总&#xff1a;当前问题回答的是那些具体的点 分&#xff1a;以1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5的方式分细节取描述相关的知识点&#xff0c;如果有哪些点不清楚&#xff0c;直接忽略过去 突出一些技术名词&#…

java 正则表达式的使用

https://segmentfault.com/q/1010000007136433/a-1020000007139400

Redis集群搭建笔记

系统为CentOS7,创建9001-9006 6个文件夹,复制 redis-server redis.conf 文件到6个新文件夹下 redis.conf文件配置如下: port 9001 daemonize yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 3000 cluster-require-full-coverage no appendonly …

记一次生产频繁出现 Full GC 的 GC日志定位

https://cloud.tencent.com/developer/article/1552089 https://www.cnblogs.com/klvchen/articles/11758324.html 感谢&#xff01;

正则高级用法-分组group+替换

public static void main(String[] args) {Pattern patternTestPattern.compile("c\\(a\\)\\(t\\(2\\)\\)");Matcher matcherTestpatternTest.matcher("c(a)(t(2))");System.out.println(matcherTest.matches()); // 全部匹配System.out.println();patter…

java 安全加密

https://www.cnblogs.com/tancky/p/6409823.html https://blog.csdn.net/gulang03/article/details/81771341

Java Servlet(一):创建工程(jdk7+tomcat7+eclipse)

本篇文件主要记录下怎么在jdk7tomcat7下&#xff0c;使用eclipse创建并运行一个servlet工程。 安装具体步骤从网上搜索就可以找到&#xff0c;这里不再赘述。 在eclipse中切换到j2ee下&#xff0c; 从导航菜单windows下找到show view选项&#xff0c;并在show view下找到server…

分支定义之Trunk vs Master

trunk是svn版本管理中的主干表示&#xff0c;而git中的主干叫master&#xff0c;因此git的master相当于svn的trunk&#xff0c;git的开发分支dev分支相当于svn里的branches SVN&#xff1a; trunk&#xff1a;是用来做主方向开发的一直向前进行&#xff0c;一个新模块的开发就…

Jsvc的使用场景

组件启动安装的操作顺序&#xff1a; 执行postinstall.sh 执行启动组件的linux服务 执行组件的__service文件 执行jsvc命令 执行spring boot的main方法 组件的卸载流程&#xff1a; 通过preuninstall.sh脚本&#xff0c;供运行和管理中心来进行调用 启动组件的底层命令&…

inline,block,inline-block的区别

display:blockblock元素会独占一行&#xff0c;多个block元素会各自新起一行。默认情况下&#xff0c;block元素宽度自动填满其父元素宽度。block元素可以设置width,height属性。块级元素即使设置了宽度,仍然是独占一行。block元素可以设置margin和padding属性。display:inline…