为了说明问题,假设现在有表test1,test1有从表test2;test1属于test3,test1和test4多对多,关联表test1_test4。

1.定义关系

class Test1Model extends WdModel {

    public function test2(){
return $this->hasOne('Test2','test1_id');
} public function test3(){
return $this->hasMany('Test3','test1_id');
}
}
class Test2Model extends WdModel {

    public function test1(){
return $this->belongsTo('Test1','test1_id');
} }

关系方法:hasOne,hasMany,belongsTo

参数一:模型名或则表明

参数二 : 关联字段

2.预加载

基本用法:

$test1 = D('Test1');
$rs = $test1->with('test2')->select();

预加载并加入查询条件

$rs = $test2->with(array('test1',function($query){
$query->field('id,name')->where('id=2');
}))->select();

如果需要同时加载多个关系模型可如下调用:

$this->with('business','category','bag','admin',array('log',function($query){
$query->where(array('gl_code'=>43));
}),array('sku',function($query){
$query->field("min(ss_cprice) as ss_cprice,ss_sa_id")->where("ss_number > 0")->group('ss_sa_id');
}));

3.延时加载

基本用法:

$test1 = D("Test1");
$test1->where(array('id'=>1))->find();
print_r($test1->test2);

带过滤条件:

$test1 = D("Test1");
$test1->where(array('id'=>1))->find();
$rs = $test1->has('test3',function($query){
$query->where('id >= 2');
});

4.其他扩展和优化

方法名 参数 参数说明
whereIn $field,$vales

简化in查询,$filed:查询字段,$valus:数组           

mapWhere $conditions

在原有where方法的基础上加入了别名识别,即原模型的$_map属性的识别

map $field

将别名映射为对应的数据库字段

isDirty    

检查模型的属性是否修改,只对使用了find方法的单条数据有效

getDirty  

获取修改过的字段,只对使用了find方法的单条数据有效

save  

优化原有的保存方法,在原有基础上加入脏检查

except
$filed

排除那些字段不查询,可接收多个参数

        $test1 = D("Test1");
$test1->where(array('id'=>1))->find();
$test1->name = "222222"; var_dump($test1->isDirty('name')); print_r($test1->getDirty()); $test1->save();

需要特别注意的是,在我们使用field等类似方法过滤字段的时候,记得一定要查询关联字段,否则关联查询会出错,其次在关联字段上进行查询过滤的时候,不要使用数组的形式,原因是TP在where时会使用array_merge合并条件,而我在处理关联查询时会使用关联字段进行in查询,并在这里我是用数组的形式写的,如果有需要可以将此处改为字符串形式,则可以解决该问题

下面说说查询的思路:

所有查询都是在主表先完成查询,之后获取主键,再去关联表做in查询,然后在PHP中合并结果,所以使用关联查询也有它的局限性,当我们需要关联表做条件过滤主表数据的时候,关联查询便不太适用.

SQL: SHOW COLUMNS FROM `test1` [ RunTime:0.002687s ]
SQL: SELECT * FROM `test1` WHERE ( `id` = 1 ) LIMIT 1 [ RunTime:0.000425s ]
SQL: SHOW COLUMNS FROM `test3` [ RunTime:0.002623s ]
SQL: SELECT * FROM `test3` WHERE ( id > 2 ) AND ( `test1_id` IN ('1') ) [ RunTime:0.000405s ]
SQL: SHOW COLUMNS FROM `test1` [ RunTime:0.001573s ]
SQL: SELECT * FROM `test1` [ RunTime:0.000262s ]
SQL: SHOW COLUMNS FROM `test2` [ RunTime:0.001488s ]
SQL: SELECT * FROM `test2` WHERE ( `test1_id` IN ('1','2','3','4','5') ) [ RunTime:0.000313s ]

下载

分享一个自己写的基于TP的关系模型的更多相关文章

  1. 分享一个自己写的基于TP的关系模型(三)

    这段时间对模型做了升级和优化,并将版本更新到TP3.2. 下载 下载后请将目录放置TP的Library目录下 1.数据节点优化,原来的节点为模型的名称或者表名,现在更新为定义关系的方法名 public ...

  2. 分享一个自己写的基于TP的关系模型(四)

    修复分页BUG,原有代码查询到最后一页就一只查询最后一页 $ ? $; $this->maxPage = ceil($this->total/$this->rows); //$thi ...

  3. 分享一个自己写的基于TP的关系模型(2)

    1.增加多对多关系的处理 /** * 定义关系 * @return array */ public function test4(){ //参数说明 //关联的模型 //主表关联字段 //关联中间表 ...

  4. 分享一个以前写的基于C#语言操作数据库的小框架

    一:前言 这个是以前写的操作MySQL数据库的小型框架,如果是中小型项目用起来也是很不错的,里面提供Filter.ModelPart.Relationship等机制实现操作数据库时的SQL语句的拼接和 ...

  5. 分享一个自己写的基于JQuery的一个Web背景切换的Demo

    这个效果主要有两个特点: 1. 背景切换的渐变 2. 背景大小自适应 3. 背景自适应保持比例同时, 相对居中 js源码: (function ($) { $.fn.bgChange = functi ...

  6. 分享一个自己写的基于canvas的原生js图片爆炸插件

    DEMO访问地址: https://bupt-hjm.github.io/BoomGo/博客地址: http://bupt-hjm.github.io/2016/07/10/boom/插件及使用方法地 ...

  7. 分享一个c#写的开源分布式消息队列equeue

    分享一个c#写的开源分布式消息队列equeue 前言 equeue消息队列中的专业术语 Topic Queue Producer Consumer Consumer Group Broker 集群消费 ...

  8. 分享一个自己写的MVC+EF “增删改查” 无刷新分页程序

    分享一个自己写的MVC+EF “增删改查” 无刷新分页程序 一.项目之前得添加几个组件artDialog.MVCPager.kindeditor-4.0.先上几个效果图.      1.首先建立一个数 ...

  9. 分享一个nodejs写的小论坛

    引言:作为一个前端小菜鸟,最近迷上了node,于是乎空闲时间,为了练练手写了一个node的小社区,关于微信小程序的,欢迎大家批评指导. 项目架构部分 一.前端架构 作为一个写样式也得无聊的前端狮,我偷 ...

随机推荐

  1. time.h

    目录 1简介 2代码示例 3从系统时钟获取时间方式 4time函数介绍 函数名称: localtime 函数名称: asctime 函数名称: ctime 函数名称: difftime 函数名称: g ...

  2. 洛谷P1407 工资

    洛谷P1407 工资 本题地址:http://www.luogu.org/problem/show?pid=1407 题目描述 有一家世界级大企业,他们经过调查,发现了一个奇特的现象,竟然在自己的公司 ...

  3. java 解惑

    java对转义字符没有提供任何特殊处理.编译器在将程序解析成各种符号之前,先将 Unicode 转义字符转换成为它们所表示的字符[JLS 3.2]

  4. Java 8 简明教程

    欢迎阅读我编写的 Java 8 介绍.本教程将带领你一步步认识这门语言的所有新特性.通过简单明了的代码示例,你将会学习到如何使用默认接口方法,Lambda表达式,方法引用和可重复注解.在这篇教程的最后 ...

  5. In Java, what is the default location for newly created files?

    If the current directory of the application. If e.g. you create a File by using new FileOutputStream ...

  6. HTML5 API 浏览器支持情况检测

    HTML5发展到现在,虽说没有大规模的普及,但在我们日常生活中,也很容易见到了,HTML5的游戏.网站.应用也是层出不穷.而作为前端人员,也应该多了解这些API为以后应用打基础,下面我将给大家介绍 H ...

  7. Highcharts可拖动式图表

    Highcharts可拖动式图表 默认情况下,Highcharts依据给定的数据列生成图表. 浏览者是无法改动图表的. 假设浏览者须要手动调整数据节点.就须要借助第三方插件Draggable Poin ...

  8. [Redux] Fetching Data on Route Change

    We will learn how to fire up an async request when the route changes. A mock server data: /** /api/i ...

  9. iOS开发-javaScript交互

    前言 当前混合开发模式迎来了前所未有的发展,跨平台开发.热更新等优点决定了这种模式的重要地位.虽然前端界面在交互.动效等多方面距离原生应用还有差距,但毫无疑问混合开发只会被越来越多的公司接受.在iOS ...

  10. Oracle 安装安全补丁过程中出现的问题

    为Oracle安装安全补丁,首先在官网上下载相应版本的补丁. 根据官方文档的说明安装,但是在安装的过程中会出项各种各样的错误,这里仅仅把我遇到的记录下来,给大家提供参考. 首先按照官方文档安装. 在这 ...