YII2常用知识点总结

(一)总结性语句

(1)经常看看yii源码比如vendor\yiisoft\yii2\web这个目录(很重要)下的文件中的方法(这些文件中的公共方法,大致看了下基本上都可以通过\Yii::$app->functionName()这种方式引用)

(2)批量操作时一般会返回成功操作的行数;

(3)尽量能用框架自带的CRUD方法就用框架的,除非sql语句非常复杂就自己拼写sql语句;

(4)把查询条件作为参数,比较安全,可直接避免注入。要是直接用在SQL语句中,最好要经过防注入处理。

 

(二)数据的增删查改

1.查:

例一:

//you have to define db connection in config/main.php

$connection = \yii::$app->db;

$queryEmailSql = "select email  from user";

$allEmail = $connection->createCommand($queryEmailSql)->queryAll();

例二:

public  static function getSubscribeByWhere($where)

{

return (new \yii\db\Query())->select(['category_id''name''create_time'])

->from(self::TableName)

->where($where)

->indexBy('category_id')

->all();

}

$where  = ['status'=>1, 'type'=>0, 'creater'=>$param['uid'], 'pid'=>$param['pid'], 'source_type'=>0];

例三:

// 取回所有活跃客户(状态为 *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 的每个元素都是键值对数组

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();

例四:

 

获得表中某一int类型字段的最大值

$maxListorder = Category::find()->select('listorder')->where(['=''pid', $pid])->orderBy('listorder desc')->limit(1)->one()->listorder;//(返回int类型的数值)

或$maxListorder = Category::find()->select(['max'=>new Expression('max(listorder)')])->where(['=', 'pid', $pid])->createCommand()->queryAll();//一个二位数组

或$maxListorder = Category::find()->select('max(listorder) as maxlistorder')->where(['=', 'pid', $pid])->asArray()->all();//一个二维数组

2.增:

方法一:

$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 "添加失败"; }

据此封装函数如下:

public function diySaveAttribs($field2ValueMap, $pkFieldName = '')
{
    foreach ($field2ValueMap as $k => $v)
    {
        $this->$k = $v;
    }
    $isOk = $this->save();

return $pkFieldName ? $this->attributes[$pkFieldName] : $isOk;
}

批量插入:

INSERT 一次插入多行

$connection->createCommand()->batchInsert('user', ['name', 'age'], [ ['Tom', 30], ['Jane', 20], ['Linda', 25], ])->execute();

$count = \yii::$app->getDb()->createCommand()->batchInsert('notice', $columnArr, $dataArr)->execute();

封装函数如下:

//批量插入
public static function batchInsert($columns, $rows, $dbConfName = '')
{
    $dbConfName = $dbConfName ? $dbConfName : static::DB;

return static::getConn($dbConfName)->createCommand()->batchInsert(static::TableName, $columns, $rows)->execute();
}

3.改:

//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

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

要查看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();

4.删:

$count = Projects::deleteAll('id=:id', [':id' => $id]);

$deletetopCount = Category::deleteAll('pid=:pid and type=:type', ['pid' => $pid, 'type' => $type]);

Category::deleteAll(['fid' => $id]);

Comment::deleteAll(['in''id', $ids]);

$count = WeiboUserAccount::deleteAll(['and', ['account_id' => $aid], ['in''user_id', $uids,]]);

$count = WechatKeyword::deleteAll(['or', ['in''id', $ids], ['in''related_id', $ids]]);

从上可看到deleteAll中的条件形式和where中的条件形式是一样的

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

//d多条件删除

$delCount = UserSubscribe::deleteAll([

'and',

['in''group_id'array_values(UserSubscribeGroup::groupMap($uid, true))/*得到 该用户的 所有 订阅分组*/],

['in''wechat_account_id', $wechatIds],

]);

(三)事务

$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());

}

(四)Yii中的常用路径总结

\Yii::$app->getRuntimePath()//获得项目runtime日志保存路径;

\Yii::$app->controller->id;// 得到当前controller的ID方法

\Yii::$app->controller->action->id;// 得到当前action的ID方法

\Yii::$app->request->hostInfo;// 得到当前域名

\yii::$app->request->userIP;//获得客户端ip

dirname(\yii::$app->basePath);//获得项目的根路径

\Yii::$app->request->referrer;//获得上一页面的请求url

\yii::$app->request->absoluteUrl;//The currently requested absolute URL

(五)Yii2中where条件使用总结

在Yii的Model里进行查询的时候 where是必不可少的。

Where方法声明为

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 ....

['type' => 1, 'status' => 2]

生成

(type = 1) AND (status = 2)

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

['id' => [1, 2, 3], 'status' => 2]

//生成

(id IN (1, 2, 3)) AND (status = 2)

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

['status' => null]

//生成

status IS NULL

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

and: 会使用 AND把所有的操作数连接起来。如

['and', 'id=1', 'id=2']
// 生成

id=1 AND id=2

如果某个运算数也是数组,那么会按如下格式转换为字符串,如['and', 'type=1', ['or', 'id=1', 'id=2']]生成type=1 AND (id=1 OR id=2)

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

or: 和 and 类似,只不过是用 OR来连接操作数。

between: 第一个操作数是列的名称,第二个和第三个操作数为范围的最小值和最大值。如

['between', 'id', 1, 10]

//生成

id BETWEEN 1 AND 10

not between: 和between 相似。

in: 第一个操作数为列或者DB表达式,第二个操作数为数组, 如['in', 'id', [1, 2, 3]]

//生成

id IN (1, 2, 3)

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

not in: 和上面的in 相似。

like: 第一个操作数为列或者DB表达式,第二个操作数为字符串或者数组如

['like', 'name', 'tester']

//生成

name LIKE '%tester%'

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

//生成

name LIKE '%test%' AND name LIKE '%sample%'

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

['like', 'name', '%tester', false]

//生成

name LIKE '%tester'

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

not like: 和like 相似。

or not like: 和or like 相似。

(六)yii中第三方类通过命名空间方式引用的方法

如下,在web.php和console.php中添加

Yii::$classMap['SmsServer'] = '@app/lib/SmsServer.php';

这样的语句,key值为命名空间的名字(最好和类名一致),value为该类在项目中的存放路径

参考网站

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

YII2常用知识点总结的更多相关文章

  1. Yii2常用操作

    获取添加或修改成功之后的数据id $insert_id = $UserModel->attributes['id']; 执行原生sql $list = Yii::$app->db-> ...

  2. DB2_SQL_常用知识点&实践

    DB2_SQL_常用知识点&实践 一.删除表中的数据(delete或truncate) 1 truncate table T_USER immediate; 说明:Truncate是一个能够快 ...

  3. JAVA常用知识点及面试题总结

    1. String.StringBuffer.StringBuilder三者区别? (1)三者在执行速率上的比较: String<StringBuffer<StringBuilder 原因 ...

  4. HTML常用知识点代码演示

    1 HTML部分常用知识点 <!-- 版本声明 --> <!DOCTYPE html> <!-- 唯一根元素 --> <html> <!-- 对网 ...

  5. Java 常用知识点

    Java 常用知识点 1.日期格式化 SimpleDateFormat Date date=new Date(System.currentTimeMillis()) ; SimpleDateForma ...

  6. Less常用知识点

    上篇文章介绍了如何安装Less,我们将所有东西都写在.less里面,最后通过命令将.less转换成.css文件,就可以放入到项目里用了.今天了解一些less常用知识点. 1.变量:声明两个变量,一个是 ...

  7. BIOS备忘录之EC常用知识点

    BIOS工程师眼中常用的EC知识点汇总: EC的硬件架构 EC硬件结构上主要分为两部分:Host Domain和EC Domain Host Domain就是通过LPC与CPU通信的部分(LPC部分需 ...

  8. CSS3常用知识点

    CSS3常用知识点 1 css3选择器 1.1 属性选择器 /* E[attr~=val] 表示的一个单独的属性值 这个属性值是以空格分隔的*/ .attr2 a[class~="kawa& ...

  9. javaScript常用知识点有哪些

    javaScript常用知识点有哪些 一.总结 一句话总结:int = ~~myVar, // to integer | 是二进制或, x|0 永远等于x:^为异或,同0异1,所以 x^0 还是永远等 ...

随机推荐

  1. Linux文件系统命令 split

    命令:split 功能:将文件按照一定的规则进行切割 用法:-l 表示按照行数进行切割. -b 表示按照字节进行切割,切割后的文件名为自己定义的文件名+aa,ab,ac类似的后缀. eg: 按照行数进 ...

  2. 第一个python程序--hello,world

    Hello World程序 在linux 下创建一个文件叫hello.py,并输入 print ('hello,word') 然后执行:python3 hello.py ,输出: [root@IDC- ...

  3. Python如何操作redis

    做UI自动化时,遇到一个问题,需要在后台操作完成后,产生结果才能在前端进行操作,但是用自动化在后台操作又很麻烦,就想直接操作数据库,然后再 在前端进行操作:这时遇到一个问题,在后台操作时,会写入到数据 ...

  4. jmeter中操作数据库

    jmeter是如何操作数据库的? 步骤一:导入jdbc的jar包,jmeter本身不能直接连接mysql,所以需要导入第三方的jar包来连接mysql 点击测试计划,添加classpath,选择mys ...

  5. aapt获取包名和activity,启动app

    1.android sdk的环境安装好了之后,在build-tools\** 的目录下找到aapt.exe,将这个路径设置环境变量,添加到path下 2.在cmdl里面输入:aapt,出现以下内容就是 ...

  6. Oracle中从控制文件读取的视图

    Oracle中有一些数据字典视图需从控制文件中读取信息,如下所示.用户在数据库打开之前就可以访问这些视图,因为这些视图的内容存储在控制文件中. v$archived_log:归档日志信息,如大小,SC ...

  7. git中工作区,缓存区,本地库,远程库的简要区别

    git中工作区,缓存区,本地库,远程库的简要区别 实际上前三个名词对应到实体,都是你从远程仓库克隆下来的那个项目目录!只不过工作区就是你实际看到的目录和目录里的内容,当你修改/添加/删除了从远程仓库c ...

  8. HDU 6095 17多校5 Rikka with Competition(思维简单题)

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  9. Git的小总结

    1.Git的介绍 Git(分布式版本控制系统)是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 下载地址:https://git-scm.com 2.介绍命令 $ git ...

  10. stack-protector-strong

    Improve protection against stack buffer overflows Much like its predecessor, stack-protector, stack- ...