山山未迟

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1、 多表连接

在查询结果,如果查询条件或查询结果不在同一张表中,那么我们需要使用多表连接

wpsF5D5.tmp

两种方式:

1)

wpsF5F5.tmp

这种查询的缺点:

wpsF606.tmp

如上图所示,如果商品表中有一个没有匹配到分类的商品,会被自动排除,也就是说,查询到的商品数量有误。

2)

wpsF616.tmp

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:

wpsF636.tmp

运行:

wpsF647.tmp

例2:查询分类的同时查询上级所属分类名称

查询结果或查询条件在同一张表中,就是自连接

wpsF658.tmp

(1) 开发控制器:

wpsF668.tmp

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)模板

wpsF679.tmp

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

wpsF68A.tmp

(2)ajaxReturn

在控制器中,提供了一个方法,名:ajaxReturn

语法:

$this->ajaxReturn($result,“ok!",1);

l data 返回数据

l info 提示信息

l status 操作状态

3) 案例1:

模板:

wpsF69A.tmp

控制器:

wpsF6AB.tmp

通过httpwatch获取数据包:

wpsF6AC.tmp

4) 分类联动案例:

(1) 将jQuery将入到项目中

wpsF6BC.tmp

wpsF6CD.tmp

(2) 在模板中,创建第一个下拉列表,用于显示所有一级分类

查询一级分类:

wpsF6ED.tmp

模板:

wpsF71D.tmp

运行:

wpsF72E.tmp

(3) 设置第一个下拉列表的绑定事件:onchange

wpsF74E.tmp

(4)创建控制器方法,用于查询所属一级分类下的所有二级分类

wpsF78E.tmp

(5)完善前台ajax程序

wpsF7AE.tmp

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) 实现文件上传

wpsF7DE.tmp

上传成功后,可以在/Public/Uploads下看到文件,可以看出,默认使用的是文件原名:

wpsF7EE.tmp

(2)将上传文件的信息入库

wpsF82E.tmp

运行:

wpsF87D.tmp

(3)完善文件上传

UploadFile类的其它属性:

l saveRule :文件命名规则  time

l autoSub :是否开启子目录功能

l subtype :子目录命名规则 date

l dateFormat :子目录命名规则date的格式

l allowExts :允许上传的文件后缀

l allowTypes  :允许上传的文件的MIME类型

wpsF8CC.tmp

运行:

wpsF8FC.tmp

wpsFB6E.tmp

4、 关联模型

如果查询结果或查询条件不在一个表中,那么可以使用关联模型解决这个问题。

1) 表关系

一对一 HAS_ONE

用户表 用户资料表

一对多 HAS_MANY

分类表 商品表

用户表 发贴表

多对一 BELONGS_TO

商品表 分类表

多对多 MANY_TO_MANY

用户表 角色表

2) RelationModel类

以前,我们定义模型时,需要使用子类模型继承父类模型。如果我们现在定义的模型需要定义表之间的关联关系,那么,这个子类模型继承父类模型。

语法:

class  UserModel   extends  RelationModel{

}

wpsFBAD.tmp

Model类中方法,RelationModel类也有这些方法

RelationModel类中特有的方法,Model类是不具备的

RelationModel类中的功能要比Model类要多。

3)$_link

这个属性定义在子类模型中,表示与其它表之间的表关联。

语法:

protected $_link = array(

'关联1'  =>  array(

'关联属性1' =>'定义',

'关联属性N' =>'定义',

),

...

  );

wpsFBAE.tmp

4)关联属性

l mapping_type :表关系

l mapping_name :关联名称(将来获取数据时使用)

l mapping_fields :要查询的字段列表

l class_name :要关联的表名称

l foreign_key :关联的字段

l parent_key :关联的字段(用于自连接)

l condition :关联条件

wpsFBCF.tmp

5) 关联查询

l relation(true)

relation是RelationModel类下的方法,只有一个参数,默认是false,表示不关联查询,true表示关联查询。

语法:

$model->relation(true)->select();

wpsFBD0.tmp

wpsFBE0.tmp

运行:

wpsFBF1.tmp

6) 关联删除

语法:

$model->relation(true)->delete();

案例:

我们要删除分类的同时,也删除这个分类下所有商品

在分类模型中,再次定义一个关联  goods

wpsFC02.tmp

另外,需要注意,在模型中,定义了多个表的关联关系,在关联查询时需要指定要关联的名称:

wpsFC12.tmp

运行:

wpsFC13.tmp

删除分类同时删除它下面的所有商品

wpsFC24.tmp

tp中的关联删除有这样一个问题,当只删除一条数据时可以实现关联删除,当对多条数据同时删除时会有问题。

wpsFC34.tmp

一、 聊天室

1、 页面设置

wpsFC45.tmp

2、 数据库设计

数据库:chat

数据表:

tp_user

tp_message

表结构:

wpsFC56.tmp

image

posted on 2016-05-08 21:17  山山未迟  阅读(263)  评论(0编辑  收藏  举报