> YII 类库手册 > CSqlDataProvider
system.web
继承 class CSqlDataProvider » CDataProvider » CComponent
实现 IDataProvider
源自 1.1.4
版本 $Id: CSqlDataProvider.php 2820 2011-01-06 17:15:56Z mDOMba $
源码
CSqlDataProvider实现一个基于纯sql语句的数据提供者。

CSqlDataProvider以数组集合的形式提供数据,每个数组代表一行查询结果。

和其他数据提供者一样,CSqlDataProvider也支持排序和分页。 通过修改给出的sql 语句的 "ORDER BY" 和 "LIMIT" 从句实现。 你可以配置sort和pagination 属性优化排序和分页行为。

CSqlDataProvider可以照以下方法使用:
$count=Yii::app()->db->createCommand('SELECT COUNT(*) FROM tbl_user')->queryScalar();
$sql='SELECT * FROM tbl_user';
$dataProvider=new CSqlDataProvider($sql, array(
    'totalItemCount'=>$count,
    'sort'=>array(
        'attributes'=>array(
             'id', 'username', 'email',
        ),
    ),
    'pagination'=>array(
        'pageSize'=>10,
    ),
));
// $dataProvider->getData() will return a list of arrays.


注意:如果你要使用分页特性,你必须配置totalItemCount 属性为所有记录条数(未分页)。如果你要使用排序特性, 你必须配置sort属性以至于数据提供者知道哪些列能进行排序。

公共属性

属性 类型 描述 定义在
data array 返回当前可用的数据项。 CDataProvider
db CDbConnection 用于查询的数据库连接。 缺省为空,意思是使用Yii::app()->db。 CSqlDataProvider
id string 返回所有数据提供者的唯一标识ID。 CDataProvider
itemCount integer 返回当前页面的数据项数目。 CDataProvider
keyField string 关键字段名。缺省为‘id’。 CSqlDataProvider
keys array 返回相关数据项的键。 CDataProvider
pagination CPagination 返回pagination对象。 CDataProvider
params array 绑定SQL语句的参数对(name=>value)。 CSqlDataProvider
sort CSort 返回sort对象。 CDataProvider
sql string 用于取得数据行的SQL语句。 CSqlDataProvider
totalItemCount integer 返回所有数据项的总数。 CDataProvider

公共方法

方法 描述 定义在
__call() 如果类中没有调的方法名,则调用这个方法。 CComponent
__construct() 构造方法。 CSqlDataProvider
__get() 返回一个属性值、一个事件处理程序列表或一个行为名称。 CComponent
__isset() 检查一个属性是否为null。 CComponent
__set() 设置一个组件的属性值。 CComponent
__unset() 设置一个组件的属性为null。 CComponent
asa() 返回这个名字的行为对象。 CComponent
attachBehavior() 附加一个行为到组件。 CComponent
attachBehaviors() 附加一个行为列表到组件。 CComponent
attachEventHandler() 为事件附加一个事件处理程序。 CComponent
canGetProperty() 确定属性是否可读。 CComponent
canSetProperty() 确定属性是否可写。 CComponent
detachBehavior() 从组件中分离一个行为。 CComponent
detachBehaviors() 从组件中分离所有行为。 CComponent
detachEventHandler() 分离一个存在的事件处理程序。 CComponent
disableBehavior() 禁用一个附加行为。 CComponent
disableBehaviors() 禁用组件附加的所有行为。 CComponent
enableBehavior() 启用一个附加行为。 CComponent
enableBehaviors() 启用组件附加的所有行为。 CComponent
evaLuateExpression() 计算一个PHP表达式,或根据组件上下文执行回调。 CComponent
getData() 返回当前可用的数据项。 CDataProvider
getEventHandlers() 返回一个事件的附加处理程序列表。 CComponent
getId() 返回所有数据提供者的唯一标识ID。 CDataProvider
getItemCount() 返回当前页面的数据项数目。 CDataProvider
getKeys() 返回相关数据项的键。 CDataProvider
getPagination() 返回pagination对象。 CDataProvider
getSort() 返回sort对象。 CDataProvider
getTotalItemCount() 返回所有数据项的总数。 CDataProvider
hasEvent() 确定一个事件是否定义。 CComponent
hasEventHandler() 检查事件是否有附加的处理程序。 CComponent
hasProperty() 确定属性是否被定义。 CComponent
raiseEvent() 发起一个事件。 CComponent
setData() 为provider设置数据项。 CDataProvider
setId() 设置provider的ID。 CDataProvider
setKeys() 为provider设置数据项的键。 CDataProvider
setPagination() 设置provider的pagination对象。 CDataProvider
setSort() 为数据提供者设置排序。 CDataProvider
setTotalItemCount() 设置所有数据项的总数。 CDataProvider

受保护方法

方法 描述 定义在
calculateTotalItemCount() 返回全部数据条数。 CSqlDataProvider
fetchData() 从持久数据存储单元提取数据。 CSqlDataProvider
fetchKeys() 从持久数据存储单元提取数据项键值。 CSqlDataProvider

属性详细

db 属性
public CDbConnection $db;

用于查询的数据库连接。 缺省为空,意思是使用Yii::app()->db。

keyField 属性
public string $keyField;

关键字段名。缺省为‘id’。

params 属性
public array $params;

绑定SQL语句的参数对(name=>value)。

sql 属性
public string $sql;

用于取得数据行的SQL语句。

方法详细

__construct() 方法
public void __construct(string $sql, array $config=array ( ))
$sql string SQL语句用来获取多行数据。
$config array 配置(name=>value)设置为这个类的初始属性值。
public function __construct($sql,$config=array())
{
    
$this->sql=$sql;
    foreach(
$config as $key=>$value)
        
$this->$key=$value;
}

构造方法。

calculateTotalItemCount() 方法
protected integer calculateTotalItemCount()
{return} integer 全部数据条数。
protected function calculateTotalItemCount()
{
    return 
0;
}

返回全部数据条数。 当调用getTotalItemCount()时这个方法被调用。 而且totalItemCount不是事先设定的。 缺省调用简单返回0。 你可以覆盖该方法返回准确的全部数据条数。

fetchData() 方法
protected array fetchData()
{return} array 数据项列表
protected function fetchData()
{
    
$sql=$this->sql;
    
$db=$this->db===null Yii::app()->db $this->db;
    
$db->active=true;

    if((
$sort=$this->getSort())!==false)
    {
        
$order=$sort->getOrderBy();
        if(!empty(
$order))
        {
            if(
preg_match('/\s+order\s+by\s+[\w\s,]+$/i',$sql))
                
$sql.=', '.$order;
            else
                
$sql.=' ORDER BY '.$order;
        }
    }

    if((
$pagination=$this->getPagination())!==false)
    {
        
$pagination->setItemCount($this->getTotalItemCount());
        
$limit=$pagination->getLimit();
        
$offset=$pagination->getOffset();
        
$sql=$db->getCommandBuilder()->applyLimit($sql,$limit,$offset);
    }

    
$command=$db->createCommand($sql);
    foreach(
$this->params as $name=>$value)
        
$command->bindValue($name,$value);

    return 
$command->queryAll();
}

从持久数据存储单元提取数据。

fetchKeys() 方法
protected array fetchKeys()
{return} array 数据项键值列表。
protected function fetchKeys()
{
    
$keys=array();
    foreach(
$this->getData() as $i=>$data)
        
$keys[$i]=$data[$this->keyField];
    return 
$keys;
}

从持久数据存储单元提取数据项键值。

上一篇:
下一篇: