Thinkphp视图模型

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

   其他错误。具体问题具体分析,不过其他问题应该都是sql语句出错,这个错误就是你的模型写错了

编辑者:http://www.zhiqiang.wang/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值