合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
[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(); ~~~