游学 2014-08-18 11:06:38 14065次浏览 2条评论 12 2 0

连接 DB(我们对数据库操作时需要一个连接对象)Yii DAO 基于 PHP Data Objects (PDO) 构建,Yii DAO 主要包含如下四个类:

  • CDbConnection: 代表一个数据库连接。
  • CDbCommand: 代表一条通过数据库执行的 SQL 语句。
  • CDbDataReader: 代表一个只向前移动的,来自一个查询结果集中的行的流。
  • CDbTransaction: 代表一个数据库事务。

我们使用 CDbConnection 连接:

$connection=new CDbConnection($dsn,$username,$password) ;
$connection->active=true or false(开启或关闭);//$dsn的格式如下(PDO 驱动的名字,跟上一个冒号,再跟上驱动特定的连接语法)
SQLite: sqlite:/path/to/dbfile
MySQL: mysql:host=localhost;dbname=testdb
PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb
SQL Server: mssql:host=localhost;dbname=testdb
Oracle: oci:dbname=//localhost:1521/testdb

由于 CDbConnection 继承自 CApplicationComponent,我们也可以将其作为一个应用组件使用,如下图

array(
    ......
    'components'=>array(
        ......
        'db'=>array(
            'class'=>'CDbConnection',
            'connectionString'=>'mysql:host=localhost;dbname=testdb',
            'username'=>'root',
            'password'=>'password',
            'emulatePrepare'=>true,  // needed by some MySQL installations
        ),
    ),
)

然后我们就可以通过 Yii::app()->db 访问数据库连接了。它已经被自动激活了,除非我们特意配置了 CDbConnection::autoConnect 为 false。
通过这种方式,这个单独的DB连接就可以在我们代码中的很多地方共享。

创建 create

例:// insert into table values($name, $mail);
execute  //return 被影响的行数  *可执行 insert update delete
Yii::app()->db->createCommand("insert into table values($name, $mail)")->execute();   
save    //return booler
$model = new Post(); $model->field=$param;$model->save();   
insert   //return booler
Yii::app()->db->createCommand()->insert('table', array('name'=>'Tester', 'email'=>'tester@example.com',));   

删除 delete

例://delete from table where user=$id;
execute   //return 被删除的行数  *可执行 insert update delete
Yii::app()->db->createCommand("delete from table where user=$id")->execute();   
delete    //return 被删除的行数
Yii::app()->db->createCommand()->delete("table","user=:id",array(":id"=>$user));   
 delete    //return booler
$model = Post::model()->findByPk(1); $model->delete();   
deleteAll   //return 被删除的行数
Post::model()->deleteAll("user=:id",array(":id"=>$id));    
deleteAllByAttributes    //return 被删除的行数
Post::model()->deleteAllByAttributes(array("user"=>$id),"name=:name",array(":name"=>$name));    
deleteByPk    //return 被删除的行数   *pk(array(1,2)) 
Post::model()->deleteByPk($id,"name=:name",array(":name"=>$name));    

更新 update

例://updae table set name=$name where user=$id;
execute   //return 被更新的行数  *可执行 insert update delete
Yii::app()->db->createCommand("updae table set name=$name where user=$id")->execute();  
save     //return booler 
$model = Post::model()->findByPk($id); $ model->name=$name;$model->save();  
updateAll   //return 被更新的行数
Post::model()->updateAll(array("name"=>$name),"user=:id",array(":id"=>$id));    
updateByPk      //return 被更新的行数
Post::model()->updateByPk($id,array("name"=>$name),$condition,array(":param"=>$param));   
updateCount     //return 被更新的行数
Post::model()->updateCounters(array("一般是计数器"=>1),"user=:id",array(":id"=>$id));

读取 read

例://select * from table where user=$id and name=$name
find    //return  record or null
Post::model()->find("user=:id  and  name=:name",array(":id"=>$id,":name"=$name));
findAll    //return  array()
Post::model()->findAll("user=:id  and  name=:name",array(":id"=>$id,":name"=$name));
findByAttributes     //return  record or null
Post::model()->findByAttributes(array("name"=>$name),"user=:id",array(":id"=>$id))
findAllByAttributes    //return   array()
Post::model()->findAllByAttributes(array("name"=>$name),"user=:id",array(":id"=>$id));
findByPK    //return  record or null
Post::model()->findByPk($id,"name=:name",array(":name"=>$name));
findAllByPk    //return array()
Post::model()->findAllByPk($id,"name=:name",array(":name"=>$name));
findBySql    //return  record or null
Post::model()->findBySql("select * from table where user=? and name=?",array($id,$name);
findAllBySql    //return  record or null
Post::model()->findAllBySql("select * from table where user=? and name=?",array($id,$name);
queryAll    //return  return array()
Yii::app()->db->createCommand("select * from table where user=$id and name=$name")->queryAll();

可以自己试一下

query();      // 查询并返回结果
queryRow();// 查询并返回结果中的第一行    
queryColumn(); // 查询并返回结果中的第一列
queryScalar();  // 查询并返回结果中第一行的第一个字段

不过这里我要单独说下 query(),因为它返回的是一个 CDbDataReader 对象而非直接的结果,因此要获取
结果集的记录可以这样:

$rows=$dataReader->readAll();   // 一次性返回所有的记录(数组)
while(($row=$dataReader->read())!==false) //CDbDataReader::read()可以一次获取一行数据,到末尾时返回false
foreach($dataReader as $row)// CDbDataReader实现了迭代器接口因此可以使用foreach遍历
觉得很赞
您需要登录后才可以评论。登录 | 立即注册