为了说明问题,假设现在有表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的关系模型的更多相关文章
-
分享一个自己写的基于TP的关系模型(三)
这段时间对模型做了升级和优化,并将版本更新到TP3.2. 下载 下载后请将目录放置TP的Library目录下 1.数据节点优化,原来的节点为模型的名称或者表名,现在更新为定义关系的方法名 public ...
-
分享一个自己写的基于TP的关系模型(四)
修复分页BUG,原有代码查询到最后一页就一只查询最后一页 $ ? $; $this->maxPage = ceil($this->total/$this->rows); //$thi ...
-
分享一个自己写的基于TP的关系模型(2)
1.增加多对多关系的处理 /** * 定义关系 * @return array */ public function test4(){ //参数说明 //关联的模型 //主表关联字段 //关联中间表 ...
-
分享一个以前写的基于C#语言操作数据库的小框架
一:前言 这个是以前写的操作MySQL数据库的小型框架,如果是中小型项目用起来也是很不错的,里面提供Filter.ModelPart.Relationship等机制实现操作数据库时的SQL语句的拼接和 ...
-
分享一个自己写的基于JQuery的一个Web背景切换的Demo
这个效果主要有两个特点: 1. 背景切换的渐变 2. 背景大小自适应 3. 背景自适应保持比例同时, 相对居中 js源码: (function ($) { $.fn.bgChange = functi ...
-
分享一个c#写的开源分布式消息队列equeue
分享一个c#写的开源分布式消息队列equeue 前言 equeue消息队列中的专业术语 Topic Queue Producer Consumer Consumer Group Broker 集群消费 ...
-
分享一个自己写的MVC+EF “增删改查” 无刷新分页程序
分享一个自己写的MVC+EF “增删改查” 无刷新分页程序 一.项目之前得添加几个组件artDialog.MVCPager.kindeditor-4.0.先上几个效果图. 1.首先建立一个数 ...
-
分享一个nodejs写的小论坛
引言:作为一个前端小菜鸟,最近迷上了node,于是乎空闲时间,为了练练手写了一个node的小社区,关于微信小程序的,欢迎大家批评指导. 项目架构部分 一.前端架构 作为一个写样式也得无聊的前端狮,我偷 ...
-
分享一个jquery写的类似于百度的搜索框,(可动态配置,可单列或者table格式,可填充数据)
需求:类似于百度的搜索框,可配置,可单列可table格式,可填充数据.页面可多次使用,简单,易用. 想法:使用jquery,css,ajax,前台调用,后台返回json数据. jquery代码: va ...
随机推荐
-
git安装和初次使用
为了知道某人安装git,我也是重装啊. 1.下载git并安装 2.打开我的电脑,右键属性,选择高级设置,打开环境变量设置: 3.键盘输入窗口键+r,或者点击开始->运行 输入cmd 在新打开的命 ...
-
.NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
-
AtomineerUtils爆破过程记录
AtomineerUtils是国外的一款用于生成源代码注释的一款VS插件,官方网站:http://www.atomineerutils.com/products.php 通过链接,可以看出这款插件的功 ...
-
多线程&;NSObject&;NSThread&;NSOperation&;GCD
1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 2.NSOperation/NS ...
-
基于visual Studio2013解决算法导论之024双向链表实现
题目 双向链表的实现 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> #i ...
-
调试经验--硬盘U菜
调试经验--硬盘U菜 随着嵌入式设备功能的开发,随着对存储设备的需求:需要存储大量数据信息.需要在转储数据,U盘升级功能等. 在使用存储设备的过程中,我们遇到一些问题,也总结了些经验: 1.几 ...
-
linux C 刚初始化后的一个变量在调用一个静态库中函数后被异常修改为乱码
linux C 中声明并初始化一个变量const char a[512]="test";后,接着调用了一个静态库中的函数函数test(b);,a并没有传入test函数,但在调用这个 ...
-
vim编辑器的命令总结
1. 设置显示行数 :set nu 2. 复制第100至第103行的代码
-
[PA2014]Lustra
[PA2014]Lustra 题目大意: 有n个工厂参加竞标.每个工厂能生产长度在\([a_i,b_i]\)之间,宽度在\([c_i,d_i]\)之间的镜子,镜子不可以旋转. 问是否有某个工厂能生产出 ...
-
idea java9以及以上 出现找不到class的情况
https://juejin.im/entry/59cdb7e65188255d3448fc64 https://blog.jetbrains.com/idea/2017/03/support-for ...