官方的AR操作文档在:http://www.yiiframework.com/doc/guide/1.1/zh_cn/database.ar
在看过AR的官方文档后,由于官文讲的数据库操作的例子太少了,虽然概念讲的很详细,但仍然对AR无从下手,特别是AR类的想法增删改查的方法,参数根本不知道如何调用。本文的主要目的是,结合官文,提供更多的操作实例,让大家快速上手AR。
以下实例是基于官文的,请大家在阅读本篇文章时,同时查看官方文档。实例中使用的数据库表例子也是官文中提到的:
CREATE TABLE tbl_post (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
title VARCHAR(128) NOT NULL,
content TEXT NOT NULL,
create_time INTEGER NOT NULL
);
代码实例如下,如果对方法调用,特别是参数有疑问的,请参考官文中对参数的解释,以及这些方法的定义。
<?php
class PostController extends CController{
public function actionCreate(){
$post = new PostModel();
$post->title = 'iPhone 5';
$post->content = 'iPhone5 content';
$post->create_time = time();
if($post->save()){
echo __CLASS__.".".__FUNCTION__." success.<br>";
}
}
public function actionSearch(){
// /**
// * find
// * @var unknown
// */
// $post = PostModel::model()->find("title=:tt", array(':tt'=>'iPhone 6s'));
// // var_dump($post);
// foreach ($post as $_key => $_value){
// echo "{$_key} : {$_value}<br>";
// }
// /**
// * find by criteria
// */
// $critetia = new CDbCriteria();
// $critetia->select = 'title,content';
// $critetia->condition = 'id=:id';
// $critetia->params = array(':id'=>3);
// $post2 = PostModel::model()->find($critetia);
// foreach ($post2 as $_key => $_value){
// echo "{$_key} : {$_value}<br>";
// }
// /**
// * find by array
// */
// $post3 = PostModel::model()->find(array(
// 'select'=>'id,title',
// 'condition'=>'id=:id',
// 'params'=>array(':id'=>1),
// ));
// foreach ($post3 as $_key => $_value){
// echo "{$_key} : {$_value}<br>";
// }
// /**
// * find by pk
// */
// $post4 = PostModel::model()->findByPk(1,"title=:tt", array(':tt'=>'iPhone 6s')
// );
// foreach ($post4 as $_key => $_value){
// echo "{$_key} : {$_value}<br>";
// }
// /**
// * find by Attributes
// */
// $post5 = PostModel::model()->findByAttributes(array('title'=>'iPhone 6s','id'=>1)/*,"title=:tt", array(':tt'=>'iPhone 6s')*/
// );
// foreach ($post5 as $_key => $_value){
// echo "{$_key} : {$_value}<br>";
// }
// /**
// * find by sql
// */
// $sql="select * from {{post}} where id=3";
// $post6 = PostModel::model()->findBySql($sql);
// foreach ($post6 as $_key => $_value){
// echo "{$_key} : {$_value}<br>";
// }
// /**
// * find by Attributes
// */
// $post6 = PostModel::model()->findAllByAttributes(array('title'=>'iPhone 5')/*,"title=:tt", array(':tt'=>'iPhone 6s')*/
// );
// foreach ($post6 as $p)
// foreach ($p as $_key => $_value){
// echo "{$_key} : {$_value}<br>";
// }
//findAll系列查询函数与find系列用法一致,此处仅举例findAllByAttributes,其他几个函数的用法同上面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);
*/
/**
* 返回符合条件的行数
*/
$lines = PostModel::model()->count('title=:title', array(':title'=>'iPhone 5'));
echo "line : {$lines}<br>";
//查询符合条件的数据行数,也可以使用如下函数
/*
// 获取满足指定条件的行数
$n=Post::model()->count($condition,$params);
// 通过指定的 SQL 获取结果行数
$n=Post::model()->countBySql($sql,$params);
*/
}
/**
* update
*/
public function actionUpdate(){
/**
* 使用静态方法model()创建的对象,在更新时,更新这些行
* @var unknown
*/
// $post = PostModel::model()->findByPk(2);
// $post->title='iPhone 6';
// if ($post->save()){
// echo "update success.<br>";
// }
// else{
// echo "update failed.<br>";
// }
/**
* 使用new创建的对象,在更新时,将会新增一行。
* @var unknown
*/
// $post = new PostModel();
// $post->findByPk(2);
// $post->title='iPhone 3';
// if ($post->save()){
// echo "update success.<br>";
// }
// else{
// echo "update failed.<br>";
// }
/**
* 上面的方法,首先执行一次查询,然后将查询结果加载出来,执行更改后,再保存到数据库中。
* 下面的方法不需要将数据事先加载出来,直接就可以更新数据库
* 注意:如果没有符合更新条件的更新操作,更新结果会返回失败。如果更新的值和原值是一样的,也会更新失败。
*/
$isUpdateSuccess = PostModel::model()->updateAll(array(
'title'=>'iPhone 1',
), 'id=:id', array(
':id'=>2,
));
if ($isUpdateSuccess){
echo "updateAll success.<br>";
}
else {
echo "updateAll failed.<br>";
}
/**
* 还可以使用如下几种方法进行更新操作
// 更新符合指定条件的行
Post::model()->updateAll($attributes,$condition,$params);
// 更新符合指定条件和主键的行
Post::model()->updateByPk($pk,$attributes,$condition,$params);
// 更新满足指定条件的行的计数列
Post::model()->updateCounters($counters,$condition,$params);
*/
}
/**
* 数据库删除操作
*/
public function actionDelete(){
/*
* 先查询再删除
*/
$post1 = PostModel::model()->findByPk(2);
if ($post1->delete()){
echo "delete success.<br>";
}
else{
echo "delete failed.<br>";
}
/*
* 以下方法可以在不事先查询并加载出查询结果的情况下进行删除,效率较高
* 以下函数用法与上面的更新操作类似,不再举例。
*/
// // 删除符合指定条件的行
// Post::model()->deleteAll($condition,$params);
// // 删除符合指定条件和主键的行
// Post::model()->deleteByPk($pk,$condition,$params);
}
}