Yii CRUD 使用方法 [ 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遍历
游学
注册时间:2012-06-30
最后登录:2014-09-19
在线时长:0小时2分
最后登录:2014-09-19
在线时长:0小时2分
- 粉丝5
- 金钱70
- 威望60
- 积分670
共 2 条评论
楼主,你确定是 2.0 的写法吗?
?????