子分类
  • 无子分类
Sql类(class Sql)
  • 2014-07-02发布
  • 2014-07-02修改

Sql类位于 Tun\Db\Sql\ 目录下,在豚中,Sql类是一个集成数据库sql语言组织类(如:Select类、Update类等)的引用方法类。在这里,定义了所有的sql关系语句,如:SQL_LEFT_JOIN、SQL_OR等。


在模型层,只需要在模型文件中用use引用Sql类的命名空间,即可使用里面的引用方法,如下所示:

<?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;
    
    }
    
    public function deleteById($id){
        $params = new Params();
        $login     = $params->getSession('login');
        
        /////////////////////////////
        $sql = new Sql($this->adapter);
        $delete = $sql->delete();
        $delete->table($this->table);
        $delete->where(array('document_id'=>$id));
        if($login['is_admin'] != 1){
            $delete->where(array('user_id'=>$login['user_id']));
        }
        $statement = $delete->statement();
        //         echo $result = $statement->prepareToString();
        //         $sql->setSql($sqlStr);
        //         $statement = $sql->statement();
        $result = $statement->prepare()->execute();
        return $result;
    }
}


代码中的use引入了命名空间

namespace User\Model;
use Tun\Db\Sql\Sql;


在模型方法中就可以用

$sql = new Sql($this->adapter);
$select = $sql->select();

来使用 $sql->select();方法。


上面代码中引用方法还有 $sql->delete();


============================================================


Sql类中可以调用的引用方法:

select()

update()

insert()

replace()

delete()

statement()


在Sql类中使用这些方法与直接调用相关的类方法的效果一样。


如:

在Sql中引用select()方法,效果等于

use Tun\Db\Sql\Select;

$select = new Select($adapter);


两者不同的是在Sql类中引用select()时,Sql类会自动传入$adapter,当然,在模型层中,$adapter是必须存在的,因此,在模型层中,也可以轻松直接调用Select类。


Sql类中可以调用的其它方法:

setSql($sqlStr) //把手动书写的sql语句传给Sql类处理

getSqlToString() //取得用select()等封装的sql语句


Sql类中sql关系常量:

SQL_LEFT_JOIN = 'LEFT JOIN';
SQL_RIGHT_JOIN = 'RIGHT JOIN';
SQL_INNER_JOIN = 'INNER JOIN';
SQL_OUTER_JOIN = 'OUTER JOIN';
SQL_AND = 'AND';
SQL_OR = 'OR';
SQL_LIKE = 'LIKE';
SQL_IN = 'IN';
SQL_NOT_IN = 'NOT IN';
SQL_EQ = '=';
SQL_GT = '>';
SQL_LT = '<';
SQL_GTE = '>=';
SQL_LTE = '<=';
SQL_NEQ = '!=';
SQL_ASC = 'ASC';
SQL_DESC = 'DESC';


注意:如果您想在zend studio中使用Sql类引用方法时也会有相对应的类的代码提示,需要把相对应的类命名空间也引入。