子分类
  • 无子分类
Select类(class Select) (group,join,order)
  • 2014-07-02发布
  • 2014-07-02修改

Select类位于 Tun\Db\Sql\ 目录下,是查询数据库数据的主要通道。在模型层中,可以通过Sql数调用Select类中的方法,也可以直接引入,通过新建对象的方式使用。


如下所示:

<?php
namespace User\Model;
use Tun\Db\Sql\Sql;
use Tun\Db\Sql\Where;
use Tun\Db\Adapter\Adapter;
use Tun\Db\Sql\Expr;
use Tun\Db\Sql\ExprWhere;
use Tun\Paginator\Paginator;
use Tun\Request\Params;
use Tun\Captcha\CaptchaCode;
class Document{
    private $sortReg = '/^[0-9]{0,11}$/';
    
    public function __construct(Adapter $adapter){
        $this->adapter = $adapter;
        $this->table = 'document';
        $this->categoryTable = 'document_cate';
    }
    /**
     *
     * @param int $id
     * @return array
     */
    public function getLists($currentPageNum,$filter= array(),$pagePreCount = 20){
        $params = new Params();
        $login     = $params->getSession('login');
        
        $table = $this->table;
        $sql = new Sql($this->adapter);
        $select = $sql->select();
        $select->from(array('a'=>$table));
        $select->join(array('ac'=>$this->categoryTable),
            'a.document_cate_id=ac.document_cate_id',array('document_cate'));
        $select->columns(array('document_id','document_cate_id','title',
            'keywords','add_time','mod_time'));
        $select->limit($pagePreCount);
        $select->offset(($currentPageNum - 1) * $pagePreCount);
        $select->order(array('a.sort'=>'DESC','a.add_time'=>'DESC',
            'document_id'=>'DESC'));
        if($login['is_admin'] != 1){
            $select->where(array('a.user_id' => $login['user_id']));
        }
        $page = new Paginator($select,$this->adapter);
        $page->setCache('document',0);
        $page->setPagePreCount($pagePreCount);
        $page->setCurrentPageNum($currentPageNum);
        $statement = $select->statement();
        //         echo $result = $statement->prepareToString();
        $result = array();
        $result['records'] = $statement->prepare()->fetchAll();
        $result['paginator'] = $page->getPaginator();
        return $result;
    
    }
}


Select中的方法解析:


from($table);

$table可以是string或一维数组,当为string时,值为表名;当为数组时,键名为表的别名,键值为表名。


join($name, $on, $columns = '*', $type = Sql::SQL_INNER_JOIN);

$name必须为一维数组,键名为表的别名,键值为表名。

$on为join条件,为一字符串,如:table1.document_cate_id = table2.document_cate_id。

$columns为要取出被Join进来的字段,是一个一维数组,当键名为字段别名,键值为对应的字段名。

$type为join类型,如 $type = Sql::SQL_INNER_JOIN。可选项为:SQL_RIGHT_JOIN、SQL_INNER_JOIN、SQL_LEFT_JOIN、SQL_OUTER_JOIN。


columns(array $columns);

$columns是一个一维数组,当数组带字符串键名时,该字段会以键名为别名取值,反之则以键值为字段名取值。$columns = array('*')表示取出主表所有字段值。


order($order);

$order可以是一个string串,也可以是一个数组。

$order的字符串格式为:'a.document_id Desc,a.add_time Desc'。

$order的数组格式为:array('a.document_id'=>'DESC','a.add_time'=>'Desc')。


limit($limit);

$limit:int值,表示要取出多少条记录。


offset($offset);

$offset:int值,表示要查找数据表记录的偏移量。


group($group);

$group可以是一个string串,也可以是一个数组。

$group的字符串格式为'a.user_id';

$group的数组格式为array('a.user_id');


where($where,$relation = Sql::SQL_AND);

参阅Where类。