Yii提供了好几种数据库查询方式,但是自带的方式用不习惯,不如直接执行sql语句来的简单明了。现在小结一下直接执行sql的方法。
- 连接数据库
$connection=Yii::app()->db; // 假设你已经建立了一个 "db" 连接 // 如果没有,你可能需要显式建立一个连接: // $connection=new CDbConnection($dsn,$username,$password); $command=$connection->createCommand($sql); // 如果需要,此 SQL 语句可通过如下方式修改: // $command->text=$newSQL;
一条 SQL 语句会通过 CDbCommand 以如下两种方式被执行:
-
execute(): 执行一个无查询 (non-query)SQL语句,例如
INSERT
,UPDATE
和DELETE
。如果成功,它将返回此执行所影响的行数。 -
query(): 执行一条会返回若干行数据的 SQL 语句,例如
SELECT
。如果成功,它将返回一个CDbDataReader 实例,通过此实例可以遍历数据的结果行。为简便起见,(Yii)还实现了一系列queryXXX()
方法以直接返回查询结果。
执行 SQL 语句时如果发生错误,将会抛出一个异常。
$rowCount=$command->execute(); // 执行无查询 SQL $dataReader=$command->query(); // 执行一个 SQL 查询 $rows=$command->queryAll(); // 查询并返回结果中的所有行 $row=$command->queryRow(); // 查询并返回结果中的第一行 $column=$command->queryColumn(); // 查询并返回结果中的第一列 $value=$command->queryScalar(); // 查询并返回结果中第一行的第一个字段
-
- 获取查询结果
在 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();
- 显示到view页
query()返回的都是一个Object对象,需要用第二部获取查询结果, 所有的queryXXX()
方法会直接返回数据。 例如, queryRow() 会返回代表查询结果第一行的一个数组。在view页,可以直接用数组的方式来访问数据!假如传回来的对象为$data[list],在view页就可以直接用$list访问数据。