视图模型和分页

一. 视图模型
关联模型可以解决一对一、一对多和多对多等关联操作。它们通过生成多条 SQL 语句
然后进行数组拼装得到最终想要的结果。对于一对一这种 HAS_ONE 和 BELONGS_TO 的多表
关联查询,可以使用视图模型。它采用的是联合查询(JOIN),非常适合此类查询需求。

在 WeiBo/Home/Controller/UserController.class.php 中的代码为:

1 class UserController extends Controller {
2     public function index() {
3         $user = D(‘UserView‘);
4         var_dump($user->group(‘id‘)->select());
5     }
6  }

注意,数据表中没有UserView的表

新建 WeiBo/Home/Model/UserViewModel.class.php ,代码为:

 1 <?php
 2 namespace Home\Model;
 3 use Think\Model\ViewModel;
 4
 5 class UserViewModel extends ViewModel {
 6     protected $viewFields = array(
 7        ‘User‘=>array(‘id‘,‘user‘,‘email‘,),
 8       ‘Card‘=>array(‘code‘,‘_on‘=>‘User.id=Card.uid‘),
 9         );
10 }

这时,就能将数据表中的user表和Card表连接起来:

其中user表为:

card表为:

连接后的数据为:

PS:使用关联查询,显示 User 表且包含 Card 表关联的数据,未关联的则忽略。如果
想把未关联的查询出来,可以使用 LEFT 左查询。

1 //LEFT JOIN
2 ‘User‘=> array(‘id‘,‘user‘,‘email‘,‘_type‘=>‘LEFT‘),
1 //使用group分组去除重复数据
2 var_dump($user->group(‘id‘)->select());
1 //使用COUNT得到关联的条数
2 ‘User‘=> array(‘id‘,‘user‘, ‘email‘,‘_type‘=>‘LEFT‘,‘COUNT(Content.id)‘=>‘abc‘),

二、分页功能

在 WeiBo/Home/Controller/UserController.class.php 中插入代码:

 1 <?php
 2 namespace Home\Controller;
 3 use Think\Controller;
 4 use Think\Page;
 5
 6 class UserController extends Controller {
 7     public function index() {
 8         $user = D(‘User‘);
 9         $count = $user->count();
10         $page = new Page($count,1);
11         $page->setConfig(‘first‘,‘首页‘);
12         $page->setConfig(‘prev‘,‘上一页‘);
13         $page->setConfig(‘next‘,‘下一页‘);
14         $page->setConfig(‘last‘,‘末页‘);
15         $page->setConfig(‘theme‘, ‘ 共 %TOTAL_ROW% 条数据 共%TOTAL_PAGE%页 %FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END%‘);
16         $show = $page->show();
17         $list = $user->limit($page->firstRow,$page->listRows)->select();
18         $this->assign(‘list‘,$list);
19         $this->assign(‘page‘,$show);
20         $this->display();
21     }
22  }

在 WeiBo/Home/View/User/index.html 中的代码如下:

1 <table border="1">
2      <tr><th>id</th><th>user</th><th>email</th></tr>
3      <foreach name="list" item="obj">
4          <tr><td>{$obj.id}</td><td>{$obj.user}</td><td>{$obj.email}</td></tr>
5      </foreach>
6 </table>
7 {$page}

显示的效果如下图:

注意:这时这里没有"首页”和"末页",下次记得去看一下手册哪里出问题了

1 //设置分页变量名
2 ‘VAR_PAGE‘=>‘page‘,

如果没设置的话,url形式为 http://localhost/demo39/index.php/User/index/p/2.html

设置后为: http://localhost/demo39/index.php/User/index/page/2.html

还有一种分页的方法为:
在 WeiBo/Home/Controller/UserController.class.php 中的代码为:

 1 <?php
 2 namespace Home\Controller;
 3 use Think\Controller;
 4 use Think\Page;
 5
 6 class UserController extends Controller {
 7     public function index() {
 8         $user = D(‘User‘);
 9         $list = $user->page($_GET[‘page‘].‘,1‘)->select();
10         $count = $user->count();
11         $page = new Page($count,1);
12         $show = $page->show();
13         $this->assign(‘list‘,$list);
14         $this->assign(‘page‘,$show);
15         $this->display();
16     }
17  }

注意,在每页显示多少条时, $page = new Page($count,1); 中后面的1必须

和 $list = $user->page($_GET[‘page‘].‘,1‘)->select(); 中的1相同。

WeiBo/Home/View/User/index.html 中的代码保持不变

时间: 2024-08-09 15:34:03

视图模型和分页的相关文章

ThinkPHP 3.2.3 视图模型的使用

ThinkPHP 3.2.3 试图模型的手册地址是:http://www.kancloud.cn/manual/thinkphp/1781 实例 需求:在博客列表页读取博客的(id.标题.摘要.发布时间.点击次数)等信息以及该篇博文所属分类的(分类名)等信息 数据表: crm_blog +---------+----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | D

知识点5-1:视图模型

对于一个在线商店,域模型可能由表现产品.订单.客户等的类所组成,它对定义这些实体的数据和业务规则都进行了封闭,这种模型用作建立用户界面以及定义业务规则的基础.尽管这种办法可能适合某些应用程序(通常是有简单域的小型应用程序),但经常会带来麻烦,特别是当应用程序增长,且要求UI偏离业务逻辑需求时,一个利害冲突可能会导致过于复杂和不可维护的软件. 这个问题的解决方法是引入视图模型(View Model),以简化渲染用户界面所需的逻辑.我们将考擦如何定义视图模型,以及用来将用户界面的数据回发给控制器层的

利刃 MVVMLight 2:Model、View、ViewModel结构以及全局视图模型注入器的说明

上一篇我们已经介绍了如何使用NuGet把MVVMLight应用到我们的WPF项目中.这篇我们来了解下一个基本的MVVMLight框架所必须的结构和运行模式. MVVMLight安装之后,我们可以看到简易的框架布局,如上篇,生成了一个ViewModel文件夹,ViewModel层的内容都放在这边,除了Main对象的ViewModel之外,还包含一个ViewModelLocator文件, 用来注入当前的ViewModel全局实例. 一.先来说说分层结构: 如图: 1.View负责前端展示,与View

视图模型

每个视图定义一个对象模型可以帮助你跟踪视图的真实所需.所以应该为每一个应用程序中的视图定义视图模型类. 每个视图都应该有一个视图模型类.可以使用控制器名称和视图名称的一个组合.例如,从Home控制器调用的命名Index的视图,其视图模型对象可能被命名为HomelndexViewModel. 更好的做法是,可以在Models文件夹中创建一个名为Home的子文件夹,并在其中建立一个IndexViewModel类. 那么如何开发一个视图模型类呢? 首先,视图模型对象是一个只有数据而(几乎)没有行为的普

ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第三章:搜索、高级过滤和视图模型

在这一章中,我们首先添加一个搜索产品的模块以增强站点的功能,然后使用视图模型而不是ViewBag向视图传递复杂数据. 注意:如果你想按照本章的代码编写示例,你必须完成第二章或者直接从www.apress.com下载第二章的源代码. 3.1 添加产品搜索 为了执行产品搜索,我们将添加一些功能使其能够按照产品名称.描述和分类进行搜索,从而让用户有一个更好的选择来查找相关结果. 之所以将分类也包含在内,是因为如果用户输入的是"clothes",而不是一件特定的衣服,那么所有的衣服都会被搜索到

架构蓝图--软件架构 &quot;4+1&quot; 视图模型

引言 我们已经看到在许多文章和书籍中,作者欲使用单张视图来捕捉所有的系统架构要点.通过仔细地观察这 些图例中的方框和箭头,不难发现作者努力地在单一视图中表达超过其表达限度的蓝图.方框是代表运行的程序吗?或者是代表源代码的程序块吗?或是物理计算机 吗?或仅仅是逻辑功能的分组吗?箭头是表示编译时的依赖关系吗?或者是控制流吗?或是数据流吗?通常它代表了许多事物.是否架构只需要单个的架构样式?有 时软件架构的缺陷源于过早地划分软件或过分的强调软件开发的单个方面:数据工程.运行效率.开发策略和团队组织等.

ThinkPHP中视图模型详解.

很多TP的新手对于模型中的视图模型不甚了解,官方虽然有详细手册,但是对于初学者来说还是比较难以理解! 先简单说一下视图模型所能实现的功能,基本就是主表与副表之间各个字段的关联问题,实现多表关联查询,相对于使用原生SQL语句来说,着实是简单不少. 首先在数据表初始化的时候,用的不是传统的M('User'),在视图模型中使用的是D('UserView'),如下图: 需要主要的是几个单词的首字母大写. 之后在Lib/Model目录中新建名为XXXViewModel.class.php(XXX为任意控制

CodeIgniter视图 &amp; 模型 &amp; 控制器

-------------------------------------------------------------------------------------------------------- 载入视图 $this->load->view('home/name'); //可以用子文件夹存储视图,默认视图文件以'.php'结尾 载入多个视图 $data['title'] = 'chenwei'; //给视图添加动态数据 $data['message'] = 'Your messa

thinkphp 视图模型使用分析

<?php /** * 视图模型 * */ class ViewBatchModel extends ViewModel{ public $viewFields = array( 'Jinxiao_batch'=>array('id','orderid','proid','subid','time','productdate','intobatch','num'), 'Jinxiao_product'=>array('id'=>'productID','default2'=>