一. 视图模型
关联模型可以解决一对一、一对多和多对多等关联操作。它们通过生成多条 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 HomeModel; 3 use ThinkModelViewModel; 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 HomeController; 3 use ThinkController; 4 use ThinkPage; 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 HomeController; 3 use ThinkController; 4 use ThinkPage; 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 中的代码保持不变