[TOC]
# AR模型
## findOne
AR模型的findOne这个静态方法是用于查找数据并转换成模型实例返回,它的参数有两种表达方式:
1. 数据ID,就是主键
2. 条件数组,和yii\\db\\Query的where数组写法一样
相当于Query对象的one方法返回一条记录的数组一样,findOne就是返回一条记录的对象,由于是对象,是对象就能有方法,有方法就能方便地执行save、delete等,以及封装更多处理逻辑
## 字段赋值
如果数据表里有name字段,则可以直接操作模型的name属性,像上面`$test2->name`这样
还可以用数组语法操作,比如`$test['name'] = 'abc'; $test->save();`
## 转成数组
Test::findOne这样查出来是个对象,可是返回给前端的要是个数组咋办,可以这样:
~~~php
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
Yii::$app->response->data = $test->toArray();
~~~
用toArray能将数据库相关的字段转换成数组来返回
## 查询多条记录
将**findOne**改成`findAll`即可,参数和findOne一模一样
它就相当于Query对象的all方法返回多条记录的数组一样,findAll就是返回多条记录的模型数组
示例代码:
~~~php
foreach(Test::findAll(['status' => 1]) as $test){
print_r($test->name, $test->age);
}
~~~
无条件findAll就传个空数组吧,但不能不传参数
## 批量更新数据
用`updateAll`方法:
~~~php
Test::updateAll(['name' => 'abc'], ['id' => $ids]);
//UPDATE test SET name = abc WHERE id in ($ids)
~~~
第一个参数是要更新的字段和值
第二个参数就是条件,当然还是跟Query的where方法参数一样啦亲
不用AR模型实现更新数据的话,那就要这样来写代码了:
~~~php
Yii::$app->db->createCommand()->update(Test::tableName(), $data, ['id' => $ids])
~~~
那至少,用AR模型写更新的代码会短一些,但当然AR不仅仅只是为了缩短代码的书写而存在……
## 实现更新 +1 之类的
要实现这样更新文章点击数量的话:(`UPDATE xxxTable SET view_count = view_count + 1`)
用`updateCounters`这个方法:
~~~php
$article = Article::findOne(1);
$article->updateCounters(['view_count' => 1]);
~~~
key就是要累加的字段,value就是要累加的值,如果是`'view_count' => 3`那自然就是`SET view_count = view_count + 3`了
## 批量删除数据
一样的思想,就是`deleteAll`方法:
~~~php
Test::deleteAll(['id' => $ids]);
//DELETE FROM test WHERE id in($ids)
~~~
参数就是删除的条件
# AR查询器
AR模型查询的时候除了有`模型::findOne(条件)`和`模型::findAll(条件)`以外,第三种常见的使用方式就是先通过find方法创建一个[AR查询器](http://www.yiichina.com/doc/api/2.0/yii-db-activequery)(yii\\db\\ActiveQuery),代码就是这样的`模型::find()->where($condition)...->all()`
先试一下:
~~~php
$testList = Test::find()->where(['type' => 3])->all();
foreach($testList as $test){
echo $test->id;
}
~~~
这样find,where,all后返回的也是一个数组,而每个元素都是一个Test模型实例,实际上是跟`Test::findAll(['type' => 3])`是等效的
# find方法存在的意义
find方法其实不做任何实际的查询,它只是创建一个查询器,你可以理解成这样一个思想:
~~~php
public static function find(){
$query = new \yii\db\ActiveQuery();
$query->from(static::tableName());
return $query;
}
~~~
这里它返回的[ActiveQuery](http://www.yiichina.com/doc/api/2.0/yii-db-activequery)也是一个查询器,跟[yii\\db\\Query](http://www.yiichina.com/doc/api/2.0/yii-db-query)这个查询器是同一性质的东西
区别是:**Query只查出纯数组形式的结果集,而ActiveQuery是查出对象形式的数据模型对象实例结果集**,可谓是一个轻量级,一个重量级
其中ActiveQuery(好了我以后都简称为AR查询器了)也能像Query一样where() select() limit() orderBy one() all()....
但是不能from(),实际上AR查询器并没有from方法让我们去设定表名(所以其实我上面的代码是无效的!它只是一个思想演示),它是通过别的方法与一个模型的表进行绑定的,我就不说那么复杂了
好了既然返回一个查询器,就可以想像到我们可以自由地控制一些查询参数来实现更多丰富的查询,这就是**find方法的存在意义**,也就是AR查询器的存在意义,比如要查询最高分的前10名用户:
~~~php
$users = User::find()
->where(['sex' => 1])
->orderBy(['score' => SORT_DESC])
->limit(10)
->all();
~~~
- 目录
- 配置
- 简介
- 别名
- gii
- 配置项
- 模型
- 简介
- 增删改查
- AR和model
- 模型事件
- 场景
- query查询
- 增删改
- AR查询器
- 模型关系定义
- AR模型连表查询
- fields
- where拼接
- 模块
- 创建模块
- 控制器
- 表单
- 跳转
- 响应
- 验证器
- Action
- 组件
- url
- 分页
- 验证码
- 缓存
- 文件上传
- 预启动组件
- 事件
- 自定义组件
- redis
- 日志
- 行为
- cookie和session
- 基础知识
- 创建一个类
- 配置一个类
- object基类
- component组件类特性
- phpstorm无法更改php等级
- url地址美化
- 过滤器
- 请求处理
- 请求组件
- 响应组件
- header
- 用户登录
- 实现IdentityInterface接口
- 登录
- 自动检测登录
- 获取用户信息
- 访问行为追踪
- phpstorm+postman断点调试