yii数据库常用操作
来源:互联网 发布:java cs 框架 编辑:程序博客网 时间:2024/06/07 08:12
一 、Active Record
1.创建记录
要向数据表中插入新行,我们要创建一个相应 AR 类的实例,设置其与表的列相关的属性,然后调用 save() 方法完成插入:
$post=new Post;$post->title='sample post';$post->content='content for the sample post';$post->create_time=time();$post->save();
2.读取记录
要读取数据表中的数据,我们可以通过如下方式调用 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);
如上所示,我们通过Post::model()
调用find
方法。 请记住,静态方法model()
是每个 AR 类所必须的。 此方法返回在对象上下文中的一个用于访问类级别方法(类似于静态类方法的东西)的 AR 实例。
如果 find
方法找到了一个满足查询条件的行,它将返回一个 Post
实例,实例的属性含有数据表行中相应列的值。 然后我们就可以像读取普通对象的属性那样读取载入的值,例如 echo $post->title;
。
如果使用给定的查询条件在数据库中没有找到任何东西, find
方法将返回 null 。
调用 find
时,我们使用 $condition
和 $params
指定查询条件。此处 $condition
可以是 SQL 语句中的 WHERE
字符串,$params
则是一个参数数组,其中的值应绑定到 $condation
中的占位符。例如:
// 查找 postID=10 的那一行$post=Post::model()->find('postID=:postID', array(':postID'=>10));
注意: 在上面的例子中,我们可能需要在特定的 DBMS 中将
postID
列的引用进行转义。 例如,如果我们使用 PostgreSQL,我们必须将此表达式写为"postID"=:postID
,因为 PostgreSQL 在默认情况下对列名大小写不敏感。
我们也可以使用 $condition
指定更复杂的查询条件。 不使用字符串,我们可以让 $condition
成为一个 CDbCriteria 的实例,它允许我们指定不限于 WHERE
的条件。 例如:
$criteria=new CDbCriteria;$criteria->select='title'; // 只选择 'title' 列$criteria->condition='postID=:postID';$criteria->params=array(':postID'=>10);$post=Post::model()->find($criteria); // $params 不需要了
注意,当使用 CDbCriteria 作为查询条件时,$params
参数不再需要了,因为它可以在 CDbCriteria 中指定,就像上面那样。
一种替代 CDbCriteria 的方法是给 find
方法传递一个数组。 数组的键和值各自对应标准(criterion)的属性名和值,上面的例子可以重写为如下:
$post=Post::model()->find(array( 'select'=>'title', 'condition'=>'postID=:postID', 'params'=>array(':postID'=>10),));
信息: 当一个查询条件是关于按指定的值匹配几个列时,我们可以使用 findByAttributes()。我们使
$attributes
参数是一个以列名做索引的值的数组。在一些框架中,此任务可以通过调用类似findByNameAndTitle
的方法实现。虽然此方法看起来很诱人, 但它常常引起混淆,冲突和比如列名大小写敏感的问题。
当有多行数据匹配指定的查询条件时,我们可以通过下面的 findAll
方法将他们全部带回。 每个都有其各自的 find
方法,就像我们已经讲过的那样。
// 查找满足指定条件的所有行$posts=Post::model()->findAll($condition,$params);// 查找带有指定主键的所有行$posts=Post::model()->findAllByPk($postIDs,$condition,$params);// 查找带有指定属性值的所有行$posts=Post::model()->findAllByAttributes($attributes,$condition,$params);// 通过指定的SQL语句查找所有行$posts=Post::model()->findAllBySql($sql,$params);
如果没有任何东西符合查询条件,findAll
将返回一个空数组。这跟 find
不同,find
会在没有找到什么东西时返回 null。
除了上面讲述的 find
和 findAll
方法,为了方便,(Yii)还提供了如下方法:
// 获取满足指定条件的行数$n=Post::model()->count($condition,$params);// 通过指定的 SQL 获取结果行数$n=Post::model()->countBySql($sql,$params);// 检查是否至少有一行复合指定的条件$exists=Post::model()->exists($condition,$params);
3. 更新记录
在 AR 实例填充了列的值之后,我们可以改变它们并把它们存回数据表。(同样通过find系列方法获取要更改的记录,然后赋值,save即可)
$post=Post::model()->findByPk(10);$post->title='new post title';$post->save(); // 将更改保存到数据库
直接更新数据表中的一行或多行而不首先载入也是可行的。 AR 提供了如下方便的类级别方法实现此目的:
直接更新数据表中的一行或多行而不首先载入也是可行的。 AR 提供了如下方便的类级别方法实现此目的:
// 更新符合指定条件的行Post::model()->updateAll($attributes,$condition,$params);// 更新符合指定条件和主键的行Post::model()->updateByPk($pk,$attributes,$condition,$params);// 更新满足指定条件的行的计数列Post::model()->updateCounters($counters,$condition,$params);
4. 删除记录
如果一个 AR 实例被一行数据填充,我们也可以删除此行数据。
$post=Post::model()->findByPk(10); // 假设有一个帖子,其 ID 为 10$post->delete(); // 从数据表中删除此行
使用下面的类级别代码,可以无需首先加载行就可以删除它。// 删除符合指定条件的行Post::model()->deleteAll($condition,$params);// 删除符合指定条件和主键的行Post::model()->deleteByPk($pk,$condition,$params);
详细可参考http://www.yiichina.com/doc/guide/1.1/database.ar
- yii数据库常用操作
- YII 框架常用语法 常用数据库操作语法
- 新 好用的 YII数据库操作常用语句
- yii数据库操作
- YII的数据库操作
- YII 数据库相关操作
- yii 数据库操作
- Yii数据库操作
- Yii 操作数据库
- yii 操作数据库详解
- Yii 中的数据库操作
- YII 数据库相关操作
- Yii数据库操作
- YII 数据库相关操作
- yii-数据库CURD操作
- Yii数据库AR操作
- Yii数据库基本操作
- yii 数据库查询操作
- JS 循环遍历JSON数据
- 1041. 考试座位号(15)
- c++inline内联函数
- Bayer Pattern
- 选择H5响应式网站建设的主要原因
- yii数据库常用操作
- collectionview接收到网络的传值
- 关于android的状态栏显示问题(AndroidStatusBar)
- 20170503cpp上机作业---派生构造
- django-自定义中间件
- CentOS7 Failed to start LSB: Bring up/down解决方法
- apache虚拟主机
- Mysql插入中文报错
- 端午节,原来还有这些历史意义!