6.23 视图模型
匿名 · 更新于 2013/12/25
视图定义
视图通常是指数据库的视图,视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。分布式查询也可用于定义使用多个异类源数据的视图。如果有几台不同的服务器分别存储组织中不同地区的数据,而您需要将这些服务器上相似结构的数据组合起来,这种方式就很有用。视图在有些数据库下面并不被支持,但是ThinkPHP模拟实现了数据库的视图,该功能可以用于多表联合查询。非常适合解决HAS_ONE 和 BELONGS_TO 类型的关联查询。
要定义视图模型,只需要继承ViewModel,然后设置viewFields属性即可。例如下面的例子,我们定义了一个BlogView模型对象,其中包括了Blog模型的id、name、title和User模型的name,以及Category模型的title字段,我们通过创建BlogView模型来快速读取一个包含了User名称和类别名称的Blog记录(集)。
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');
默认情况下会根据定义的名称自动获取表名,如果希望指定数据表,可以使用:
'_table'=>"test_db.test_table"
'_as'=>'myBlog'
'Category'=>array('title'=>'category_name');
'title'=>'category_name'
'_on'=>'Blog.category_id=Category.id'
Blog.categoryId=Category.id AND Blog.userId=User.id
SelectBlog.id as id,Blog.name as name,Blog.title as title,Category.title as category_name,User.name as usernamefrom think_blog Blog JOIN think_category Category JOIN think_user Userwhere Blog.category_id=Category.id AND Blog.user_id=User.id
ThinkPHP还可以支持视图模型的JOIN类型定义,我们可以把上面的视图定义改成:
public $viewFields = array('Blog'=>array('id','name','title','_type'=>'LEFT'),'Category'=>array('title'=>'category_name','_on'=>'Category.id=Blog.category_id','_type'=>'RIGHT'),'User'=>array('name'=>'username','_on'=>'User.id=Blog.user_id'),);
'_type'=>'LEFT'
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 LEFT JOIN think_category Category ON Blog.category_id=Category.id RIGHT JOIN think_user User ON Blog.user_id=User.id
我们可以在试图模型里面定义特殊的字段,例如下面的例子定义了一个统计字段
'Category'=>array('title'=>'category_name','COUNT(Blog.id)'=>'count','_on'=>'Category.id=Blog.category_id'),
3
视图查询
接下来,我们就可以和使用普通模型一样对视图模型进行操作了 。$Model = D("BlogView");$Model->field('id,name,title,category_name,username')->where('id>10')->order('id desc')->select();
$Model->field('id,name,title,category_name,username')->order('id desc')->group('id')->select();
$Model = D("Blog");
$Model->table('think_blog Blog,think_category Category,think_user User')->field('Blog.id,Blog.name,Blog.title,Category.title as category_name,User.name as username')->order('Blog.id desc')->where('Blog.category_id=Category.id AND Blog.user_id=User.id')->select();
