Yii 框架的数据库操作


Yii 框架的数据库操作:


1 yii 框架中的 DAO (data access object)

数据访问对象(DAO) 对访问存储在不同数据库管理系统(DBMS)中的数据提供了一个通用的API。因此,在将底层 DBMS 更换为另一个时,无需修改使用了 DAO 访问数据的代码。

Yii DAO 基于 PHP Data Objects (PDO) 构建。

它是一个为众多流行的DBMS提供统一数据访问的扩展,这些 DBMS 包括 MySQL, PostgreSQL 等等。
要使用 Yii DAO,PDO 扩展和特定的 PDO 数据库驱动(例如 PDO_MYSQL) 必须安装。

Yii DAO 的组成:

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

建立数据库连接 CDbConnection

要建立一个数据库连接,创建一个 CDbConnection 实例并将其激活。 连接到数据库需要一个数据源的名字(DSN)以指定连接信息

DSN 类型:

 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

建立连接方法:

  1  
    $connection=new CDbConnection($dsn,$username,$password);
              // 建立连接。你可以使用  try...catch 捕获可能抛出的异常
              $connection->active=true;
              ......
              $connection->active=false;  // 关闭连接
  
  
    
   2 
     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
 
       $connection=Yii::app()->db; 

执行数据SQL语句 CDbCommand

$command=$connection->createCommand($sql);

一条 SQL 语句会通过 CDbCommand 以如下两种方式被执行:

execute(): 执行一个无查询 (non-query)SQL语句, 例如 INSERT, UPDATE 和 DELETE 。如果成功,它将返回此执行所影响的行数。

query(): 执行一条会返回若干行数据的 SQL 语句,例如 SELECT。 如果成功,它将返回一个 CDbDataReader 实例

$rowCount=$command->execute();   // 执行无查询 SQL
$dataReader=$command->query();   // 执行一个 SQL 查询
$rows=$command->queryAll();      // 查询并返回结果中的所有行
$row=$command->queryRow();       // 查询并返回结果中的第一行
$column=$command->queryColumn(); // 查询并返回结果中的第一列
$value=$command->queryScalar();  // 查询并返回结果中第一行的第一个字段

获取查询结果: CDbDataReader

  在 CDbCommand::query() 生成 CDbDataReader 实例之后,可以通过重复调用 CDbDataReader::read() 获取结果中的行。
  也可以在 PHP 的 foreach 语言结构中使用 CDbDataReader 一行行检索数据。 

 $dataReader=$command->query();
 // 重复调用 read() 直到它返回 false
     while(($row=$dataReader->read())!==false) { ... }
 // 使用 foreach 遍历数据中的每一行
      foreach($dataReader as $row) { ... }
 // 一次性提取所有行到一个数组
     $rows=$dataReader->readAll();

使用事务:CDbTransaction

  当一个应用要执行几条查询,每条查询要从数据库中读取并/或向数据库中写入信息时, 保证数据库没有留下几条查询而只执行了另外几条查询是非常重要的。
  事务,在 Yii 中表现为 CDbTransaction 

  开始事务.
  一个个执行查询。任何对数据库的更新对外界不可见。
  提交事务。如果事务成功,更新变为可见。
  如果查询中的一个失败,整个事务回滚


    $transaction=$connection->beginTransaction();
    try
       {
        $connection->createCommand($sql1)->execute();
        $connection->createCommand($sql2)->execute();
        //.... other SQL executions
        $transaction->commit();
    }
    catch(Exception $e) // 如果有一条查询失败,则会抛出异常
    {
        $transaction->rollBack();
       }


2 yii 框架中的 Active Record (AR)

Active Record (AR) 是一个流行的 对象-关系映射 (ORM) 技术

每个 AR 类代表一个数据表(或视图),数据表(或视图)的列在 AR 类中体现为类的属性,一个 AR 实例则表示表中的一行。常见的 CRUD 操作作为 AR 的方法实现

建立数据库连接:

AR 依靠一个数据库连接以执行数据库相关的操作。默认情况下, 它假定 db 应用组件提供了所需的 CDbConnection 数据库连接实例。如下应用配置提供了一个例子:

        return array(
            'components'=>array(
                'db'=>array(
                    'class'=>'system.db.CDbConnection',
                    'connectionString'=>'sqlite:path/to/dbfile',
                    // 开启表结构缓存(schema caching)提高性能
                    // 'schemaCachingDuration'=>3600,
                ),
            ),
        );

定义一个AR类:

要访问一个数据表,我们首先需要通过集成 CActiveRecord 定义一个 AR 类。 每个 AR 类代表一个单独的数据表,一个 AR 实例则代表那个表中的一行。

  class Post extends CActiveRecord
  {
      public static function model($className=__CLASS__)
      {
          return parent::model($className);
      }
   
      public function tableName()
      {
          return 'tbl_post';
      }
  }

创建记录

要向数据表中插入新行,我们要创建一个相应 AR 类的实例,设置其与表的列相关的属性,然后调用 save() 方法完成插入:

     $post=new Post;
     $post->title='sample post';
     $post->content='content for the sample post';
     $post->create_time=time();
     $post->save()

读取记录

要读取数据表中的数据,我们可以通过如下方式调用 find 系列方法中的一种:

     // 查找满足指定条件的结果中的第一行
     $post=Post::model()->find($condition,$params);
     // 查找具有指定主键值的那一行
     $post=Post::model()->findByPk($postID,$condition,$params);
     // 查找具有指定属性值的行
     $post=Post::model()->findByAttributes($attributes,$condition,$params);
     // 通过指定的 SQL 语句查找结果中的第一行
     $post=Post::model()->findBySql($sql,$params)


3 几种获取访问数据的几种方法

 a
     
    Yii::app()->projectdb->createCommand()
                               ->select('id,name')
                               ->from('project.domob_department')
                               ->queryAll();
     
     
     $user_email = Yii::app()->adminDb->createCommand()
                     ->select('username')
                     ->from('admin.user')
                     ->where('userid ='.$_POST['AeDep']['userid'])
                     ->queryScalar();
     
     
    $returnArr = CHtml::listData($Arr, 'id', 'name');
     
     
     
 b
     
    $domobDepartment = DomobDepartment::model()->findByPk($id);   
     
     
 c              
     
    $name = Yii::app()->projectdb->createCommand("select realname from admin.user where userid=$uid")->queryScalar();
Buy me a 肥仔水!