TP入门第十一天

1、数据库视图

视图通常是指数据库的视图,视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。分布式查询也可用于定义使用多个异类源数据的视图。如果有几台不同的服务器分别存储组织中不同地区的数据,而您需要将这些服务器上相似结构的数据组合起来,这种方式就很有用。

要定义视图模型,只需要继承ViewModel,然后设置viewFields属性即可

例子:

class BlogViewModel extends ViewModel {

public $viewFields = array(

‘Blog’=>array(‘id’,’name’,’title’),

‘Category’=>array(‘title’=>’category_name’,’_on’=>’Blog.category_id=Category.id’),

‘User’=>array(‘name’=>’username’,’_on’=>’Blog.user_id=User.id’),

);

}

我们来解释一下定义的格式代表了什么。

$viewFields 属性表示视图模型包含的字段,每个元素定义了某个数据表或者模型的字段。

例如:

‘Blog’=>array(‘id’,’name’,’title’)

表示BlogView视图模型要包含Blog模型中的idnametitle字段属性,这个其实很容易理解,就和数据库的视图要包含某个数据表的字段一样。而Blog相当于是给Blog模型对应的数据表定义了一个别名。

默认情况下会根据定义的名称自动获取表名,如果希望指定数据表,可以使用:

‘_table’=>”test_db.test_table”

如果希望给当前数据表定义另外的别名,可以使用

‘_as’=>’myBlog’

BlogView视图模式除了包含Blog模型之外,还包含了CategoryUser模型,下面的定义:

‘Category’=>array(‘title’=>’category_name’)

和上面类似,表示BlogView视图模型还要包含Category模型的title字段,因为视图模型里面已经存在了一个title字段,所以我们通过

‘title’=>’category_name’

Category模型的title字段映射为category_name字段,如果有多个字段,可以使用同样的方式添加。可以通过_on来给视图模型定义关联查询条件,例如:

‘_on’=>’Blog.category_id=Category.id’

理解之后,User模型的定义方式同样也就很容易理解了。

Blog.categoryId=Category.id AND Blog.userId=User.id

最后,我们把视图模型的定义翻译成SQL语句就更加容易理解视图模型的原理了。假设我们不带任何其他条件查询全部的字段,那么查询的SQL语句就是

Select

Blog.id as id,

Blog.name as name,

Blog.title as title,

Category.title as category_name,

User.name as username

from think_blog Blog JOIN think_category Category JOIN think_user User

where Blog.category_id=Category.id AND Blog.user_id=User.id

当然我们也可以不用视图进行数据查询但是显然非常繁琐。而定义了视图模型之后,所有的字段会进行自动处理,添加表别名和字段别名,从而简化了原来视图的复杂查询。

(具体是用需要到应用中说明)

2、缓存

ThinkPHP在数据缓存方面包括文件方式、共享内存方式和数据库方式在内的多种方式进行缓存,通过插件方式还可以增加以后需要的缓存类,让应用开发可以选择更加适合自己的缓存方式,从而有效地提高应用执行效率。目前已经支持的缓存方式包括:File、Apachenote、Apc、Eaccelerator、Memcache、Shmop、Sqlite、Db、Redis和Xcache。

使用方法:

所有的缓存方式都被统一使用公共的调用接口,这个接口就是Cache缓存类。

缓存类的使用很简单,首先实例化缓存类:

$Cache = Cache::getInstance(‘缓存方式’,’缓存参数’);

缓存方式 可以支持FileApachenoteApcEacceleratorMemcacheShmopSqliteDbRedisXcache
缓存参数(根据不同的缓存方式存在不同的参数) 通用缓存参数 expire缓存有效期(默认由DATA_CACHE_TIME参数配置)length缓存队列长度(默认为0

queue缓存队列方式(默认为file还支持xcacheapc

缓存方式 额外支持的缓存参数
File(文件缓存) temp缓存目录(默认由DATA_CACHE_PATH参数配置)
Apachenote缓存 host缓存服务器地址( 默认为127.0.0.1
Apc缓存 暂无其他参数
Eaccelerator缓存 暂无其他参数
Xcache缓存 暂无其他参数
Memcache host缓存服务器地址( 默认为127.0.0.1port端口(默认为MEMCACHE_PORT参数或者11211

timieout缓存超时(默认由DATA_CACHE_TIME参数设置)

persistent长连接(默认为false

Shmop size(默认由SHARE_MEM_SIZE参数设置)tmp(默认为TEMP_PATH

project(默认为s

length缓存队列长度(默认为0

Sqlite db数据库名称(默认:memory:table表名(默认为sharedmemory

persistent长连接(默认为false

Db db数据库名称(默认由DB_NAME参数配置)table数据表名称(默认由DATA_CACHE_TABLE参数配置)
Redis host服务器地址(默认由REDIS_HOST参数配置或者127.0.0.1port端口(默认由REDIS_PORT参数配置或者6379

timeout超时时间(默认由DATA_CACHE_TIME配置或者false

persistent长连接(默认为false

例如,使用Xcache作为缓存方式,缓存有效期60秒。

$Cache = Cache::getInstance(‘Xcache’,array(‘expire’=>’60’));

设置缓存参数

实例化缓存类的时候如果没有指定缓存参数,可以通过setOptions方法具体指定:

$Cache->setOptions(‘temp’,’ThinkPHP’);

具体缓存参数根据不同的缓存方式有所区别。

如果需要获取当前缓存驱动的参数,可以使用:

$value = $Cache->getOptions(‘temp’);

存取缓存数据

$Cache->set(‘name’,’ThinkPHP’);  // 缓存name数据

$value = $Cache->get(‘name’); // 获取缓存的name数据

$Cache->rm(‘name’);  // 删除缓存的name数据

或者使用下面的方法是等效的:

$Cache->name =’ThinkPHP’;

$value = $Cache->name;

Unset($Cache->name);

缓存设置方法可以重新指定缓存有效期,例如:

$Cache->set(‘name’,’ThinkPHP’,3600);  // 缓存name数据3600

TP3.0中添加了缓存队列的功能

使用缓存队列很简单,只需要给当前缓存实例设置length参数即可,默认length参数为0,表示不启用缓存队列功能。下面的缓存队列的设置:

$Cache = Cache::getInstance(‘Xcache’,array(‘expire’=>’60’,’length’=>10));

或者

$Cache = Cache::getInstance(‘Xcache’,array(‘expire’=>’60’));

$Cache->setOptions(‘length’,10); //设置缓存队列长度为10

$Cache->setOptions(‘queue’,’xcache’); //设置缓存队列方式为xcache

具体快捷缓存、快速缓存等其他知识参考手册进行学习

Tagged , , , , . Bookmark the permalink.

Comments are closed.