视图通常是指数据库的视图,视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。分布式查询也可用于定义使用多个异类源数据的视图。如果有几台不同的服务器分别存储组织中不同地区的数据,而您需要将这些服务器上相似结构的数据组合起来,这种方式就很有用。视图在有些数据库下面并不被支持,但是ThinkPHP模拟实现了数据库的视图,该功能可以用于多表联合查询。非常适合解决HAS_ONE 和 BELONGS_TO 类型的关联查询。
根据个人理解重新分析文档中的例子
namespace Home\Model;
use Think\Model\ViewModel;
class BlogViewModel extends ViewModel {
public $viewFields = array(
'Blog'=>array('id','name','title'),
'Category'=>array('title'=>'category_name', '_on'=>'Blog.category_id=Category.id'),
);
}
一行一行分析
'Blog'=>array('id','name','title');
表示BlogView视图模型要包含Blog模型中的id、name和title字段属性,相当于是给Blog模型对应的数据表定义了一个别名。
'Category'=>array('title'=>'category_name', '_on'=>'Blog.category_id=Category.id'),
表示BlogView视图模型要包含Category模型中title字段映射为category_name字段
通过_on来给视图模型定义关联查询条件,像如下代码blog模型中的categorg_id和category模型中的id关联
'_on'=>'Blog.category_id=Category.id'
以上代码生成的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
然后就是BlogController.class.php写如下代码
$Model = D("BlogView");
$Model->field('id,name,title,category_name,username')->where('id>10')->order('id desc')->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();
上面的不是重点,下面的才开始是遇到的问题才是重点
错误1:
1146:Table 'thinkphp.think__bb_view' doesn't exist [ SQL语句 ] : SHOW COLUMNS FROM `think__bb_view`
我在官方看到好多这样的错误,但是没有任何一个能给出一个正确答案的。只有一个会员评论中说:”视图模型的命名空间写错了, 所以找不到!“这个答案也正确,但是这句话有点小歧义,所有我当初理解半天没有理解出来,我的回答就是:”没有找到BlogView这个模型“所以要规范书写哦。我总结规范有如下规范:
1.命名要规范,官方给出的案例默认的文件名称应该是BlogViewModel.class.php,在这里小编就出现这样的错误,把文件名称写成BlogViewModel.Model.php,因为小编认为这个是模型,所有应该是Model
2.命名空间问题namespace Home\Model;这个home你要根据自己的实际情况,如果你是在Admin模块下就需要写成这样的 namespace Admin\Model