八、MVC之 数据库DAO方式操作CRUD

原创
2013/10/12 12:12
阅读数 796
要使用数据库需要在配置文件main.php中给db组件配置相应的参数,这里以mysql为例

......
        'db'=>array(
            'connectionString' => 'mysql:host=localhost;dbname=test',//指定库名与主机名
            'emulatePrepare' => true,
            'username' => 'root',
            'password' => 'root',
            'charset' => 'utf8',
            'tablePrefix'=>'',//表前缀,默认为null
        ),
 ......
在test库中创建user表
CREATE TABLE `user` (
 `id` int(10) unsigned NOT NULL auto_increment,
 `username` varchar(32) character set utf8 NOT NULL COMMENT '用户名',
 `city_id` int(10) unsigned NOT NULL default '0' COMMENT '城市id',
 `create_time` int(10) unsigned NOT NULL default '0' COMMENT '创建时间',
 `update_time` int(10) unsigned NOT NULL default '0' COMMENT '更新时间',
 PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='用户表'

 
此时我们就可以使用Yii::app()->db这个应用组件使用queryBuilder来进行系列的数据库操作
 
 
首先我们来创建一个QueryController控制器,queryBuilder的crud操作我们在这个控制器里面演示
 

class QueryController extends Controller{
 
}
接下来我们来往数据库里添加数据,创建一个actionCreate方法
public function actionCreate(){
        //使用CDbCommand的insert方法,第一个参数传全表名,第二个参数传字段与对应值的数组
        $res = Yii::app()->db->createCommand()->insert('user', array(
            'username'=>'菩提'
        ));
        dump(Yii::app()->db->getLastInsertID());//输出 最近插入数据的id 1
    }
 
此时我们在数据库中就可以看到已经插入成功了一行数据

如果我们想要修改这条数据,也很简单,先创建一个actionUpdate方法
//动作方法支持参数的形式,只不过参数的名字要与传参的名称保存一致
    public function actionUpdate($id){
        $id = trim($id);
        //使用db应用组件创造了一个cdbcommand的对象,执行update方法,第一个参数是表名,第二个参数是要修改字段的键值对,第三个是where条件,第四个是参数绑定
        $res = Yii::app()->db->createCommand()->update('user', array(
            'username'=>'天师',
        ), 'id=:id', array(':id'=>$id));
        dump($res);//输出 1表示影响了一行数据
    }

此时我们再看数据库里面username已经变成了天师

如果我们想要删除这行数据又怎么做咧,我们先创建一个actionDelete方法
public function actionDelete($id){
        $id = trim($id);
        //使用db应用组件创建一个cdbcommand对象,调用delete方法,第一个参数user,第二个参数删除的条件,第三个参数绑定条件
        $res = Yii::app()->db->createCommand()->delete('user', 'id=:id', array(':id'=>$id));
        dump($res);//输出影响的行数 1
    }

此时我们再看数据库里面,数据已经被删除


queryBuilder的查询支持4种
1.查询一行数据queryRow,创建一个actionRow的方法

public function actionRow(){
        //查询一行数据
        $user = Yii::app()->db->createCommand()->select('*')->from('user')->where('id=:id',array(':id'=>'3'))->queryRow();
        dump($user);
    }

//打印结果如图:

2.查询多行数据queryAll,创建一个actionAll方法
public function actionAll(){
        $users = Yii::app()->db->createCommand()
                               ->select('*')
                               ->from('user')
                               ->where('id>3 AND id<6')
                               ->queryAll();
        dump($users);
    }

打印效果如下图

queryBuilder对where语句进行了完美封装,上面的查询语句可以等同于

public function actionAll(){
        $users = Yii::app()->db->createCommand()
                               ->select('*')
                               ->from('user')
                               ->where(array('and','id>3','id<6'))
                               ->queryAll();
        dump($users);
    }

 
在1.1.13版本中,yii又新加了一个andWhere方法,复杂的查询场景中我们推荐这种方式,上面的查询语句可以等同于

public function actionAll(){
        $users = Yii::app()->db->createCommand()
                               ->select('*')
                               ->from('user')
                               ->where('id>3')
                               ->andWhere('id<6')
                               ->queryAll();
        dump($users);
    }

 
有时候我们需要对查询出来的数据进行分页排序,queryBuilder里面封装了Limit、offset、order方法

public function actionAll(){
        $users = Yii::app()->db->createCommand()
                               ->select('*')
                               ->from('user')
                               ->where('id>3')
                               ->andWhere('id<8')
                               ->limit(2)
                               ->offset(2)
                               ->order('id DESC')
                               ->queryAll();
        dump($users);
    }
3.查询某一个具体字段的一个值,比如统计符合条件的总数,我们使用queryScalar方法
public function actionScalar(){
        $count = Yii::app()->db->createCommand()->select('count(1)')->from('user')->queryScalar();
        dump($count);//输出 9 表示目前数据库里面有9行数据
    }

 
4.有的时候我们需要查询某个字段符合条件的所有值,比如查符合条件的所有id,我们可以使用queryAll查询出来再遍历数组获取,但是queryBuilder有更好的方法queryColumn
public function actionColumn(){
        $names = Yii::app()->db->createCommand()->select('username')->from('user')->where('id>6')->queryColumn();
        dump($names);
    }

 
打印结果如下

5.更多的时候我们需要连表查询,queryBuilder为我们封装了join系列方法
首先我们创建一个城市表city
 
CREATE TABLE `city` (
 `id` int(10) unsigned NOT NULL auto_increment,
 `name` varchar(32) character set utf8 NOT NULL COMMENT '城市名',
 `create_time` int(10) unsigned NOT NULL default '0' COMMENT '创建时间',
 PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='城市表'

 
然后往城市里面插几条数据
INSERT INTO `test`.`city` (`id`, `name`, `create_time`) VALUES ('1', '北京', '0'),('3', '上海', '0'),('3', '广州', '0'), ('4', '武汉', '0');

 
把user随机的分配城市id
public function actionAssign(){
        $users = Yii::app()->db->createCommand()->select('id')->from('user')->queryColumn();
        $city_ids = Yii::app()->db->createCommand()->select('id')->from('city')->queryColumn();
 
        if(!empty($users)){
            foreach ($users as $id) {
                $key = array_rand($city_ids);
                Yii::app()->db->createCommand()->update('user', array(
                    'city_id'=>$city_ids[$key]
                ), 'id=:id',array(':id'=>$id));
            }
        }
        echo 'done!';
    }

 
此时我们再看数据库里面user表的city_id都已经分配到值了

再在控制器中创建一个actionJoin方法
public function actionJoin(){
        //join的第一个参数是要连接的那个表,第二个参数是join的On条件
        $users = Yii::app()->db->createCommand()
                               ->select('u.id,u.username,c.name')
                               ->from('user as u')
                               ->join('city as c','c.id=u.city_id')
                               ->where('u.id>4 AND u.id<7')
                               ->queryAll();
        dump($users);
    }

打印结果如下

作者注:queryBuilder是高效的,对于查询多条记录,我推荐使用queryBuilder,查询单条记录并且不需要进行修改删除等操作,也推荐使用queryBuilder,不过对于数据的添加和修改Yii为我们准备了更好的东西,那就是ActiveRecord

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部