1、alias 用于設置數據表別名
$user = M('User'); var_dump($user->alias('anothername')->select());
這時在SQL中的查詢語句為
需要注意的是如果將anothername 中的another 和name中加空格,這樣是有問題的。就無法連接數據庫了。
2、group 方法通常用于對結合函數統計的結果集分組。
$user = M('User'); var_dump($user->field('user,max(id)')->group('id')->select());
這時是按group里的id來分組,相同的id的則會在一起,如果是group('email'),則會根據email相同的分在一組,這時可能不是email所有的都會相同
但是按email第一個匹配的分在一塊。這里的 field('user,max(id)') 是只取數據庫里的user和id,其他的不顯示
SQL語句為 SELECT `user`,max(id) FROM `think_user` GROUP BY id
3、having 方法一般用于配合 group 方法完成從分組的結果中再篩選數據。
$user = M('User'); var_dump($user->field('user,max(id)')->group('id')->having('id>2')->select());
從group分好組后,就開始篩選組里大于2的顯示出來
SQL語句為 SELECT `user`,max(id) FROM `think_user` GROUP BY id HAVING id>2
4、distinct方法用于返回唯一不同的值
$user = M('User'); var_dump($user->distinct( true)->field('user')->select());
這時如果是相同的值就不會再顯示出來
5、cache 用于查詢緩存操作
$user = M('User'); var_dump($user->cache(true)->select());
PS:第一次查詢數據庫,第二次查詢相同的內容直接調用緩存,不用再查詢數據庫。
三、命名范圍
命名范圍其實就是將 SQL 語句封裝在模型定義類里,而不在控制器里。這樣的分層操
作有利于代碼的可讀性,避免開發人員在寫 CURD 操作時出現問題。架構人員只要在命名范
圍內合理的規劃即可,類似于架構師架構了接口,讓開發人員面向接口開發一樣。
要使用命名范圍,第一步要定義屬性:
在 Home/Model/UserModel.class.php 里插入以下代碼:
<?php namespace Home\Model; use Think\Model; class UserModel extends Model { protected $_scope = array( //$_scope是固定的,不可更改 'sql1' => array( 'where'=>array('id'=>1), ), 'sql2' =>array( 'order'=>array('date'=>'DESC'), 'limit'=> 2, ), 'default'=>array( 'where'=>array('id'=>2) ), ); }
然后在 Home/controller/UserController.class.php 中調用,需要注意的是,調用的時候scope也是不能改變的。
1.
$user = D('User'); var_dump($user->scope('sql1')->select());
這時得到的SQL查詢語句為: SELECT * FROM `think_user` WHERE ( `id` = 1 )
2.
var_dump($user->scope('sql2')->select());
得到的SQL查詢語句為: SELECT * FROM `think_user` ORDER BY `date` DESC LIMIT 2
3、
var_dump($user->scope('sql2')->scope('sql1')->select());
得到的SQL語句為:
SELECT * FROM `think_user` WHERE ( `id` = 1 ) ORDER BY `date` DESC LIMIT 2
4.
var_dump($user->scope()->select());
得到的SQL語句為: SELECT * FROM `think_user` WHERE ( `id` = 2 )
這時調用的default數組,也就是在調用scope()里面不需要填入參數
5.
var_dump($user->scope('sql2',array('limit'=>4))->select());
在調用時改變原來sql2的數組的條件,也可以改變全部的
6.
var_dump($user->scope(array('where'=>array('id'=>1),'order'=>'date desc','limit'=>4))->select());
這時是直接寫入參數,不調用類里面的參數
7.
var_dump($user->sql1()->select());
這里是把寫在類里的數組直接當作方法來調用,效果和調用sql1是一樣的。
文章列表