关于关联模型

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 '',
`click` smallint(6) unsigned NOT NULL DEFAULT '',
`cid` int(10) unsigned NOT NULL,
`del` tinyint(1) unsigned NOT NULL DEFAULT '',
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 '',
`sort` smallint(6) NOT NULL DEFAULT '',
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:

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

说明:

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

实例化 Model 类

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

 <?php
namespace Admin\Controller;
use Admin\Common\Category; class BlogController extends CommonController{
//博文列表
public function index() {
$this->blog = D('BlogRelation')->get_blogs();
$this->display();
} //添加博文
public function add_blog() {
//博文分类
$cate = M('cate')->order('sort')->select();
$this->cate = Category::level($cate);//一维数组无限极分类 //博文属性
$this->attr = M('attr')->select(); $this->display();
} //添加博文表单处理
public function add_blog_handle() {
//echo '<pre>';print_r($_POST);
$data = array(
'title'=>I('title'),
'content'=>I('content'),
'time'=>time(),
'click'=>I('click', 0, 'int'),
'cid'=>I('cid'),
); //属性插入到博文-属性中间表 开始
/*if(isset($_POST['aid'])) {
foreach($_POST['aid'] as $v) {
$data['attr'][] = $v;//attr:关联表名称
}
}*/ /*D('BlogRelation')->relation(true)->add($data);*/
//$this->display('blog');//用于查看trace信息(config.php定义)
//属性插入到博文-属性中间表 结束 //自定义插入关联表(不使用关联模型)开始,哪种方法都可以
if($bid = M('blog')->add($data)) {
if(isset($_POST['aid'])) {
$sql = 'INSERT INTO `'.C('DB_PREFIX').'blog_attr` (bid,aid) VALUES ';
foreach($_POST['aid'] as $v) {
$sql .= '('.$bid.','.$v.'),';
}
$sql = rtrim($sql,',');
M()->execute($sql);
}
$this->success('添加成功', U('Admin/Blog/index'));
} else {
$this->error('添加失败');
}
//自定义插入关联表(不使用关联模型)结束 } //删除到回收站/还原
public function to_recycle_bin () {
$id = (int)$_GET['id'];
$type = (int)$_GET['type'];
$update = array(
'id'=>$id,
'del'=>$type
);
$msg = $type ? '删除' : '还原';
$location = $type ? U('Admin/Blog/index','','') : U('Admin/Blog/recycle_bin','','');
if(M('blog')->save($update)) {
$this->success($msg.'成功' ,$location);
} else {
$this->error($msg.'失败');
}
} //回收站
public function recycle_bin() {
$this->blog = D('BlogRelation')->get_blogs(1);
$this->display('index');
} //彻底删除
public function delete() {
$id = (int)$_GET['id'];
//使用关联模型删除 或 手动删除
if(D('BlogRelation')->relation('attr')->delete($id)) {
$this->success('删除成功',U('Admin/Blog/recycle_bin'));
} else {
$this->error('删除失败');
}
} //清空回收站
}

ThinkPHP 3.2.3 关联模型的使用的更多相关文章

  1. ThinkPHP第十一天(关联模型使用,独立分组配置,MySQL concat用法)

    1.关联模型的使用 定义方式:新建一个类文件UserRelationModel.class.php Class UserRelationModel extends RelationModel{ pro ...

  2. ThinkPHP第十五天(setField、setInc、setDec、关联模型)

    1.ThinkPHP中的比较特殊连贯操作 如果要更新某个字段可以用setField方法,比如M('user')->where('id=1')->setField('username','T ...

  3. ThinkPHP第十四天(显示TRACE界面配置,关联模型详解定义)

    1.显示TRACE界面,首选需要在显示模版界面,$this->display(),然后需要在配置文件中配置 SHOW_PAGE_TRACE => true 2.关联模型使用 主表以user ...

  4. ThinkPHP 关联模型(二十)

    原文:ThinkPHP 关联模型(二十) ThinkPHP关联模型 两表关联查询:Message 和  user  关联条件uid(参考手册:模型->关联模型) 步骤: 一:创建Message表 ...

  5. ThinkPHP关联模型详解

    在ThinkPHP中,关联模型更类似一种mysql中的外键约束,但是外键约束更加安全,缺点却是在写sql语句的时候不方便,ThinkPHP很好得解决了这个问题.但是很多人不动关联模型的意思.现在就写个 ...

  6. ThinkPHP关联模型如何关联非主键

    ThinkPHP关联模型默认是主键外键关联 官方并没有提供相关文档 如何实现非主键与非主键间之间的关联 <?php namespace Admin\Model; use Think\Model\ ...

  7. thinkphp 关联模型配置代码

    <?php /** * 公司与部门关联模型 */ class CompanyRelationModel extends RelationModel{ //主表名称 protected $tabl ...

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

    一.关联模型 ( RelationMondel ) 1.数据查询 ① HAS_ONE 查询 创建两张数据表评论表和文章表: tpk_comment , tpk_article .评论和文章的对应关系为 ...

  9. ThinkPHP 关联模型中查询某条记录的父级(非查询子级)

    数据表 id      cat_name      cat_pid 76     手机.数码     0 84     手机配件        76 86     蓝牙耳机        84 从属关 ...

随机推荐

  1. 20145223《Java程序程序设计》第10周学习总结

    20145223<Java网络编程> 一.Java的网络编程 ·网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. ·java.net包中J2SE的API包含有类 ...

  2. 【转】Docker 常用命令

    转载: http://blog.csdn.net/zhang__jiayu/article/details/42611469   docker images:列出本地所有镜像 docker searc ...

  3. iOS KVO 学习笔记

    //// //// main.m //// TestBasis //// //// Created by ficow on 16/1/14. //// Copyright © 2016年 ficow. ...

  4. Python学习笔记04

    语句之后有冒号,表示有一个语句块,且以四个空格的缩进来表示隶属关系. 与C# 相比,没有了{},没有了(),被冒号和缩进取代了 if,while,for,range,continue,break if ...

  5. R AnalyticFlow---R的流程图

    0.简介 R AnalyticFlow是一款利用R环境作为统计计算的数据分析软件,创作者是日本人,版权属于日本Ef-prime公司.R AnalyticFlow除了拥有直观的用户界面和流程图显示,它还 ...

  6. 20145304 Java第八周学习报告

    20145304<Java程序设计>第八周学习总结 教材学习内容总结 NIO NIO使用频道来衔接数据节点,在处理数据时,NIO可以让你设定缓冲区容量,在缓冲区中对感兴趣的数据区块进行标记 ...

  7. Android AIDL 进行进程间通讯(IPC)

    编写AIDL文件时,需要注意: 1.接口名和aidl文件名相同. 2.接口和方法前不用加访问权限修饰符 (public.private.protected等,也不能用final.static). 3. ...

  8. 为什么我们要使用min-height和max-height样式属性?

    Css min-height应用地方解释我们有时设置一个对象盒子时候避免对象没有内容时候不能撑开,但内容多少不能确定所以又不能固定高度,这个时候我们就会需要css来设置min-height最小高度撑高 ...

  9. 【BZOJ1677】[Usaco2005 Jan]Sumsets 求和 递推

    ... #include <iostream> using namespace std; ]; int n,i; int main() { cin>>n; f[]=; ;i&l ...

  10. SQLSERVER的NULL

    判断数据库中某个值是否为null(而不是'null',空字符串'',若干个空格' ') 一定不能用=null 或 !=null,而要用is null 或 is not null. 在sqlserver ...