首页 > 数据库技术 > 详细

YII总结之数据库的增删查改

时间:2016-01-20 00:57:02      阅读:225      评论:0      收藏:0      [点我收藏+]

查:

例一:  

$connection = \yii::$app->db; //you have to define db connection in config/main.php
$queryEmailSql = "select email from user";
$allEmail = $connection->createCommand($queryEmailSql)->queryAll();
例二:(说明:把查询条件作为参数,比较安全,可直接避免注入。要是直接用在SQL语句中,最好要经过防注入处理。)

$db = Yii::app()->db; //you have to define db connection in config/main.php

$sql = "select sum(if(starttime>‘09:00:00‘,1,0)) as late,
  sum(if(endtime<‘18:00:00‘,1,0)) as early        
from present where userid=:userid and date between :date_start and :date_end"
$results = $db->createCommand($sql)->query(array(
  ‘:userid‘ => 115,‘:date_start‘=>‘2009-12-1‘,‘:date_end‘=>‘2009-12-31‘,
));
foreach($results as $result){
echo $result[‘late‘]," and ",$result[‘early‘]," /n";
}

等同于

$sql = "select sum(if(starttime>‘09:00:00‘,1,0)) as late,

  sum(if(endtime<‘18:00:00‘,1,0)) as early        
from present where userid=115 and date between ‘2009-12-1‘ and ‘2009-12-31‘"
$results = $db->createCommand($sql)->query();
foreach($results as $result){
echo $result[‘late‘]," and ",$result[‘early‘]," /n";
}

//1.该方法是根据一个条件查询一个集合

$admin=Admin::model()->findAll($condition,$params);

$admin=Admin::model()->findAll("username=:name",array(":name"=>$username));

//2. findAllByPk(该方法是根据主键查询一个集合,可以使用多个主键)

$admin=Admin::model()->findAllByPk($postIDs,$condition,$params);

$admin=Admin::model()->findAllByPk($id,"name like :name and age=:age",array(‘:name‘=>$name,‘age‘=>$age));

$admin=Admin::model()->findAllByPk(array(1,2));//????

//3.findAllByAttributes (该方法是根据条件查询一个集合,可以是多个条件,把条件放到数组里面)

$admin=Admin::model()->findAllByAttributes($attributes,$condition,$params);

$admin=Admin::model()->findAllByAttributes(array(‘username‘=>‘admin‘));

//4.findAllBySql (该方法是根据SQL语句查询一个数组)

$admin=Admin::model()->findAllBySql($sql,$params);

$admin=Admin::model()->findAllBySql("select * from admin where username like :name",array(‘:name‘=>‘yang%‘));



//拼一个获得SQL的方法,在根据find查询出一个对象

$criteria=new CDbCriteria;

$criteria->select=‘username‘; // only select the ‘username‘ column

$criteria->condition=‘username=:username‘;

$criteria->params=array(":username=>‘admin‘");

$criteria->order = "id DESC";

$criteria->limit = "3";

$post=Post::model()->find($criteria); // $params isnot needed


查询个数,判断查询是否有结果

//该方法是根据一个条件查询一个集合有多少条记录,返回一个int型数字

$n=Post::model()->count($condition,$params);

$n=Post::model()->count("username=:name",array(":name"=>$username));

//该方法是根据SQL语句查询一个集合有多少条记录,返回一个int型数字

$n=Post::model()->countBySql($sql,$params);

$n=Post::model()->countBySql("select * from admin where username=:name",array(‘:name‘=>‘admin‘));

//该方法是根据一个条件查询查询得到的数组有没有数据,如果有数据返回一个true,否则没有找到

$exists=Post::model()->exists($condition,$params);

$exists=Post::model()->exists("name=:name",array(":name"=>$username));



$admin=Admin::model()->findBySql ($sql,$params);
该方法是根据SQL语句查询一组数据,他查询的也是第一条数据,如: 
findBySql("select *from admin where username=:name",array(‘:name‘=>‘admin‘));


// 取回所有活跃客户(状态为 *active* 的客户)并以他们的 ID 排序:

$customers = Customer::find()

->where([‘status‘ => Customer::STATUS_ACTIVE])

->orderBy(‘id‘)

->all();

// 返回ID为1的客户:

$customer = Customer::find()

->where([‘id‘ => 1])

->one();

// 取回活跃客户的数量:

$count = Customer::find()

->where([‘status‘ => Customer::STATUS_ACTIVE])

->count();

// 以客户ID索引结果集:

$customers = Customer::find()->indexBy(‘id‘)->all();

// $customers 数组以 ID 为索引

// 用原生 SQL 语句检索客户:

$sql = ‘SELECT * FROM customer‘;

$customers = Customer::findBySql($sql)->all();


// 返回 id 为 1 的客户

$customer = Customer::findOne(1);

// 返回 id 为 1 且状态为 *active* 的客户

$customer = Customer::findOne([

‘id‘ => 1,

‘status‘ => Customer::STATUS_ACTIVE,

]);

// 返回id为1、2、3的一组客户

$customers = Customer::findAll([1, 2, 3]);

// 返回所有状态为 "deleted" 的客户

$customer = Customer::findAll([

‘status‘ => Customer::STATUS_DELETED,

]);


// 以数组而不是对象形式取回客户信息:

$customers = Customer::find()

->asArray()

->all();

// $customers 的每个元素都是键值对数组

// 一次提取 10 个客户信息

foreach (Customer::find()->batch(10) as $customers) {

// $customers 是 10 个或更少的客户对象的数组

}

// 一次提取 10 个客户并一个一个地遍历处理

foreach (Customer::find()->each(10) as $customer) {

// $customer 是一个 ”Customer“ 对象

}

// 贪婪加载模式的批处理查询

foreach (Customer::find()->with(‘orders‘)->each() as $customer) {

}


http://www.yiifans.com/yii2/guide/db-active-record.html

User::find()->all();    此方法返回所有数据;

User::findOne($id);   此方法返回 主键 id=1 的一条数据(举个例子); 

User::find()->where([‘name‘ => ‘小伙儿‘])->one();   此方法返回 [‘name‘ => ‘小伙儿‘] 的一条数据;

User::find()->where([‘name‘ => ‘小伙儿‘])->all();   此方法返回 [‘name‘ => ‘小伙儿‘] 的所有数据;

User::find()->orderBy(‘id DESC‘)->all();   此方法是排序查询;

User::findBySql(‘SELECT * FROM user‘)->all();  此方法是用 sql  语句查询 user 表里面的所有数据;

User::findBySql(‘SELECT * FROM user‘)->one();  此方法是用 sql  语句查询 user 表里面的一条数据;

User::find()->andWhere([‘sex‘ => ‘男‘, ‘age‘ => ‘24‘])->count(‘id‘);   统计符合条件的总条数;

User::find()->one();    此方法返回一条数据;

User::find()->all();    此方法返回所有数据;

User::find()->count();    此方法返回记录的数量;

User::find()->average();    此方法返回指定列的平均值;

User::find()->min();    此方法返回指定列的最小值 ;

User::find()->max();    此方法返回指定列的最大值 ;

User::find()->scalar();    此方法返回值的第一行第一列的查询结果;

User::find()->column();    此方法返回查询结果中的第一列的值;

User::find()->exists();    此方法返回一个值指示是否包含查询结果的数据行;

User::find()->batch(10);  每次取 10 条数据 

User::find()->each(10);  每次取 10 条数据, 迭代查询
User::find()->select([‘id‘,‘name‘,‘author‘])->where([‘in‘,‘id‘,$ids])->asArray()->all();
增:
方法一:
$applyres = $connection->createCommand()->insert(‘user‘,[‘email‘=>$email, ‘name‘=>$name, ‘mobile‘=>$phone, ‘status‘=>$status,‘create_time‘=>time(), ‘is_super‘=>0, ‘password‘=>new Expression(‘PASSWORD(:p)‘,[‘:p‘=>$password]), ‘remark‘=>$disc])->execute();//成功返回1,否则返回0

方法二:

$admin = new Admin;      

$admin->username = $username;

$admin->password = $password;

$admin->save();

if( $admin->save()> 0){

echo "添加成功";

$id = $admin->attributes[‘id‘];//返回刚才插入的那条数据的id

}else{ echo "添加失败"; }


修改
//update user set mobile=‘{$phone}‘,remark=‘{$remark}‘ where email=‘{$email}‘;
$count =User::updateAll(array(‘mobile‘=>$phone,‘remark‘=>$remark),‘email=:email‘,array(‘:email‘=>$email));
//第一个参数是$attributes,第二个参数是$conditions,第三个参数是条件的的值$param
或者用createCommand()的方式

Post::model()->updateAll($attributes,$condition,$params);

$count =Admin::model()->updateAll(array(‘username‘=>‘11111‘,‘password‘=>‘11111‘),‘password=:pass‘,array(‘:pass‘=>‘1111a1‘));

//修改password为1111a1的username=1111 and password=11111

if($count > 0){ echo "修改成功"; }else{ echo "修改失败"; }



$res = User::updateAll([‘status‘=>3],‘id=:id‘,[‘:id‘=>$userId]);//修改id为$userId的status为3

//$pk主键,可以是一个也可以是一个集合,$attributes是要修改的字段的集合,$condition条件,$params传入的值

Post::model()->updateByPk($pk,$attributes,$condition,$params);    

$count =Admin::model()->updateByPk(1,array(‘username‘=>‘admin‘,‘password‘=>‘admin‘));//修改主键为1的用户名为admin密码为admin

$count =Admin::model()->updateByPk(1,array(‘username‘=>‘admin,‘password‘=>‘admin),‘username=:name and password:psw‘,array(‘:name‘=>‘commonuser‘,‘:psw‘=>‘compassword‘));//修改主键为1且username=commonuser,password=compassword那条记录的username为admin,password为admin

if($count>0){ echo "修改成功"; }else{ echo "修改失败"; }

Post::model()->updateCounters($counters,$condition,$params);

$count=Admin::model()->updateCounters(array(‘status‘=>1),‘username=:name‘,array(‘:name‘=>‘admin‘));

//array(‘status‘=>1)代表数据库中的post表根据条件username=‘admin‘,查询出的所有结果status字段都自加1

if($count > 0){ echo "修改成功"; }else{ echo "修改失败"; }

$userLimitRet = UserLimit::model()->findByPk (array (‘user_id‘ => $userId,  ‘category_id‘ => $v));
$userLimitRet->order = $order;
if (! $userLimitRet->update ()) {
}
 
$userAmount=userAmount::model()->findByPk ($userId);
$userAmount->credit=Yii::app()->request->getParam(‘credit‘,10000);
$ret = $userAmount->save ();

若要查看sql语句可在execute之前执行getRawSql()
$connection->createCommand()->insert(‘user‘, [‘email‘ => $email, ‘name‘ => $name, ‘mobile‘ => $phone, ‘status‘ => $status, ‘create_time‘ => time(), ‘is_super‘ => 0, ‘password‘ => new Expression(‘PASSWORD(:p)‘, [‘:p‘ => $password]), ‘remark‘ => $disc])->getRawSql();

删除:

//deleteAll

Post::model()->deleteAll($condition,$params);

$count = Admin::model()->deleteAll(‘username=:name and password=:pass‘,array(‘:name‘=>‘admin‘,‘:pass‘=>‘admin‘));

$count = Admin::model()->deleteAll(‘id in("1,2,3")‘);//删除id为这些的数据

if($count>0){echo "删除成功"; }else{ echo "删除失败"; }

//deleteByPk

Post::model()->deleteByPk($pk,$condition,$params);

$count = Admin::model()->deleteByPk(1);

$count =Admin::model()->deleteByPk(array(1,2),‘username=:name‘,array(‘:name‘=>‘admin‘));

if($count>0){ echo "删除成功"; }else{ echo "删除失败"; }



$connection->createCommand()->delete(‘user‘, ‘id = :userid and email=:email‘, [‘:userid‘=>$userid, ‘:email‘=>444])->execute();//打印出的语句DELETE FROM `user` WHERE id = ‘124‘ and email=444

其他:


事务

$db = Yii::app()->db;
$dbTrans = $db->beginTransaction();

$dbTrans->commit();
$dbTrans->rollback();

//事务的基本结构(多表更新插入操作请使用事务处理)

$dbTrans = Yii::app()->db->beginTransaction();

try{

$post = new Post;

$post->‘title‘ = ‘Hello dodobook!!!‘;

if(!$post->save()) throw new Exception("Error Processing Request", 1);

$dbTrans->commit();

//  $this->_end(0,‘添加成功!!!‘);

}catch(Exception $e){

$dbTrans->rollback();

//  $this->_end($e->getCode(),$e->getMessage());

}




YII2中where函数讲解

在Yii的Model里进行查询的时候 where是必不可少的。
Where方法声明为

  1. static where( $condition )

复制代码

其中参数 $condition类型为字符串或者数组
1、字符串
字符串是最简单的,直接按sql中的where条件写就可以,如

  1. $condition = ‘name=\‘xiaoming\‘ and age>10‘;

复制代码

2、数组
如果是数组的情况下,有两种格式的写法。

  • name-value格式的字典数组:[‘column1‘ => value1, ‘column2‘ => value2, ...]
  • 逻辑操作符格式:[operator, operand1, operand2, ...]

第一种写法:
如果value值是字符串或者数字等,那么生成的条件语句格式为column1=value1 AND column2=value2 AND ....
  1. [‘type‘ => 1, ‘status‘ => 2] 
  2. //生成 
  3. (type = 1) AND (status = 2)

复制代码

如果value值是数组,那么会生成sql 中的IN语句;

  1. [‘id‘ => [1, 2, 3], ‘status‘ => 2]
  2. //生成 
  3. (id IN (1, 2, 3)) AND (status = 2)

复制代码

如果value值为Null,那么会生成 Is Null语句。

  1. [‘status‘ => null]
  2. //生成 
  3. status IS NULL

复制代码

第二种写法会根据不同的操作符生成不同的sql条件。

  • and: 会使用 AND把所有的操作数连接起来。如
    1. [‘and‘, ‘id=1‘, ‘id=2‘]
    2. // 生成 
    3. id=1 AND id=2

    复制代码

    如果某个运算数也是数组,那么会按如下格式转换为字符串,如

    1. [‘and‘, ‘type=1‘, [‘or‘, ‘id=1‘, ‘id=2‘]]
    2. //生成
    3. type=1 AND (id=1 OR id=2)

    复制代码

    注意:这个方法不会对进行引用或者编码操作。

  • or: 和 and 类似,只不过是用 OR来连接操作数。
  • between: 第一个操作数是列的名称,第二个和第三个操作数为范围的最小值和最大值。如
    1. [‘between‘, ‘id‘, 1, 10]
    2. //生成 
    3. id BETWEEN 1 AND 10

    复制代码

  • not between: 和between 相似。
  • in: 第一个操作数为列或者DB表达式,第二个操作数为数组, 如
    1. [‘in‘, ‘id‘, [1, 2, 3]]
    2. //生成 
    3. id IN (1, 2, 3)

    复制代码

    注意:这个方法会对列进行引用,对数组中的值也会编码。

  • not in: 和上面的in 相似。
  • like: 第一个操作数为列或者DB表达式,第二个操作数为字符串或者数组如
    1. [‘like‘, ‘name‘, ‘tester‘] 
    2. //生成 
    3. name LIKE ‘%tester%‘

    复制代码

    如果值是数组的话,会生成多个like语句,并用 AND来连接。如

    1. [‘like‘, ‘name‘, [‘test‘, ‘sample‘]]
    2. //生成 
    3. name LIKE ‘%test%‘ AND name LIKE ‘%sample%‘

    复制代码

    注意:这个方法会对列进行引用,对数组中的值也会编码。
    有时候你可能需要自己来处理%,那么可以用第三个参数:

    1. [‘like‘, ‘name‘, ‘%tester‘, false]
    2. //生成 
    3. name LIKE ‘%tester‘

    复制代码

  • or like: 和like相似,只是在第二个参数为数组的情况下用or来连接多个like 语句。
  • not like: 和like 相似。
  • or not like: 和or like 相似。

参考:

http://www.yii-china.com/video/index.html

http://www.yii-china.com/tutorial/index.html?type=2

http://www.yiichina.com/doc/guide/2.0

YII总结之数据库的增删查改

原文:http://www.cnblogs.com/ryanlamp/p/5143809.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!