1、 多表连接
在查询结果,如果查询条件或查询结果不在同一张表中,那么我们需要使用多表连接
两种方式:
1)
这种查询的缺点:
如上图所示,如果商品表中有一个没有匹配到分类的商品,会被自动排除,也就是说,查询到的商品数量有误。
2)
TP中的表连接操作:
1) table :实现上面的第一种连接方式
语法:
$model-> table(‘table1 t1,table t2’)
->where(‘t1.id=t2.sid’)
->select();
2) join:实现上面的第二种连接方式
语法:
$model-> join(‘[t1] left(right) join t2 on t1.sid=t2.id’)
->select();
例1:
运行:
例2:查询分类的同时查询上级所属分类名称
查询结果或查询条件在同一张表中,就是自连接
(1) 开发控制器:
D(‘Category’)->join(‘t1 left join sp_category t2 on t1.pid=t2.pid);
指定要左联接的两个表,指定两个的连接条件
D(‘Category’)->join(‘t1 left join sp_category t2 on t1.pid=t2.pid)->field(‘t1.*,t2.name cate_name’);
指定要查询的字段列表,是t1表的所有字段和t2表的name字段
(2)模板
2、 Ajax应用
1) ajax的原生代码:
var xhr=new XMLHttpRequest();
xhr.onreadystatechange=function(){
if(xhr.readyState==4 && xhr.status==200){
xhr.responseText
}
}
xhr.open(‘get’,’test.php?user=zhangsan’);
xhr.send(null);
2) tp中的Ajax
(1)DEFAULT_AJAX_RETURN
修改配置文件:config.php
(2)ajaxReturn
在控制器中,提供了一个方法,名:ajaxReturn
语法:
$this->ajaxReturn($result,“ok!",1);
l data 返回数据
l info 提示信息
l status 操作状态
3) 案例1:
模板:
控制器:
通过httpwatch获取数据包:
4) 分类联动案例:
(1) 将jQuery将入到项目中
(2) 在模板中,创建第一个下拉列表,用于显示所有一级分类
查询一级分类:
模板:
运行:
(3) 设置第一个下拉列表的绑定事件:onchange
(4)创建控制器方法,用于查询所属一级分类下的所有二级分类
(5)完善前台ajax程序
3、 文件上传
在tp中,有一个类:ORG/Net/UploadFile,用于实现文件上传功能
上传代码:
l import ( 'ORG.Net.UploadFile' );
l $upload = new UploadFile ();
l $upload->savePath = './Public/Uploads/';
l if (! $upload->upload ()) {
l echo $upload->getErrorMsg ();
l } else {
l $info = $upload->getUploadFileInfo ();
l }
(1) 实现文件上传
上传成功后,可以在/Public/Uploads下看到文件,可以看出,默认使用的是文件原名:
(2)将上传文件的信息入库
运行:
(3)完善文件上传
UploadFile类的其它属性:
l saveRule :文件命名规则 time
l autoSub :是否开启子目录功能
l subtype :子目录命名规则 date
l dateFormat :子目录命名规则date的格式
l allowExts :允许上传的文件后缀
l allowTypes :允许上传的文件的MIME类型
运行:
4、 关联模型
如果查询结果或查询条件不在一个表中,那么可以使用关联模型解决这个问题。
1) 表关系
一对一 HAS_ONE
用户表 用户资料表
一对多 HAS_MANY
分类表 商品表
用户表 发贴表
多对一 BELONGS_TO
商品表 分类表
多对多 MANY_TO_MANY
用户表 角色表
2) RelationModel类
以前,我们定义模型时,需要使用子类模型继承父类模型。如果我们现在定义的模型需要定义表之间的关联关系,那么,这个子类模型继承父类模型。
语法:
class UserModel extends RelationModel{
}
Model类中方法,RelationModel类也有这些方法
RelationModel类中特有的方法,Model类是不具备的
RelationModel类中的功能要比Model类要多。
3)$_link
这个属性定义在子类模型中,表示与其它表之间的表关联。
语法:
protected $_link = array(
'关联1' => array(
'关联属性1' =>'定义',
'关联属性N' =>'定义',
),
...
);
4)关联属性
l mapping_type :表关系
l mapping_name :关联名称(将来获取数据时使用)
l mapping_fields :要查询的字段列表
l class_name :要关联的表名称
l foreign_key :关联的字段
l parent_key :关联的字段(用于自连接)
l condition :关联条件
5) 关联查询
l relation(true)
relation是RelationModel类下的方法,只有一个参数,默认是false,表示不关联查询,true表示关联查询。
语法:
$model->relation(true)->select();
运行:
6) 关联删除
语法:
$model->relation(true)->delete();
案例:
我们要删除分类的同时,也删除这个分类下所有商品
在分类模型中,再次定义一个关联 goods
另外,需要注意,在模型中,定义了多个表的关联关系,在关联查询时需要指定要关联的名称:
运行:
删除分类同时删除它下面的所有商品
tp中的关联删除有这样一个问题,当只删除一条数据时可以实现关联删除,当对多条数据同时删除时会有问题。
一、 聊天室
1、 页面设置
2、 数据库设计
数据库:chat
数据表:
tp_user
tp_message
表结构: