# Yii2模型 [TOC] 模型需要继承自`yii\db\ActiveRecord`。 ## 普通SQL查询 使用PDO的占位符方式,防止sql注入。 ```sql <?php namespace app\controllers; use app\models\Article; use yii\web\Controller; class HomeController extends Controller { public function actionIndex() { $id = \Yii::$app->request->get('id'); $sql = 'select * from article where id=:id'; $articles = $article = Article::findBySql($sql,[':id'=>$id])->all(); } } ``` ## 使用模型连贯操作 ### 查询所有数据 获取`article`表中所有数据。 ```php $articles = Article::find()->all(); ``` ### 条件限制获取数据 以下查询`id`为数据表主键。 #### 查询单条数据 我们可以使用`where()`进行条件拼接查询也可以通过`findOne()`方法进行查询。 ```php $article = Article::find()->where(['id'=>5])->one(); $article = Article::findOne(5); $article = Article::findOne(['id'=>5]); ``` #### 查询`id`为`3`、`4`和`5`的数据 使用`findAll()`方法进行查询。 ```php $articles = Article::findAll([3,4,5]); ``` #### 查询大于`3`的数据 ```php $articles = Article::find()->where(['>','id',3])->all(); ``` #### 查询大于`2`且小于`5`的数据 ```php $articles = Article::find()->where(['between','id',2,5])->all(); ``` #### 模糊查询 根据其他字段进行模糊查询,如根据`title`字段进行模糊查询。 ```php $articles = Article::find()->where('like','title','模糊')->all(); ``` ### 将查询数据对象转成数组   在Laravel框架中,我们可以在使用连贯查询的时候使用`toArray()`方法将查询的数据对象转换成数组,方便使用。   那么在Yii2中,我们可以使用`asArray()`得到同样的效果。当然,如果查询的数据量比较大的话这样做能节省服务器内存,如: ```php $article = Article::find()->asArray()->all(); ``` ### 模型数据的新增 通过`add()`或者`save()`方法将数据写入到数据表,执行成功后它们返回的都是`true`。 ```php public function actionCreate() { $article = new Article; $article->title = 'insert title'; $article->views = 12; $article->save(); // 也可以使用 $article->add(); // 获取写入的数据id $id = $article->attributes['id']; } ``` ### 模型数据的删除 #### 删除单条数据 ```php $article = Article::findOne(10); $article->delete(); ``` > 成功返回1。 #### 删除多条数据 ```php Article::deleteAll('id=7'); // 删除id=7的数据 Article::deleteAll('id=:id',[':id'=>7]); // 同上 Article::deleteAll('id>:id',[':id'=>10]); // 删除id>10的数据 Article::delteteAll('id>:id AND views < :views',[':id'=>10,':views'=>100]); // 删除id>10并且查看次数小于100。 ``` ### 模型数据的修改   通过`update()`方法将数据更新到数据表,同时也可通过`save()`方法做同样的操作。如下: ```php public function actionUpdate() { $article = Article::findOne(9); $article->title = 'update title'; // $res = $article->update(); // 成功返回 1 $res = $article->save(); // 成功返回 true } ``` #### 更新数据表某个字段 更新`id = 9`的数据的`views`字段+1。成功返回1,失败返回0。 ```php Article::updateAllCounters(['views'=>1],['id'=>9]); ``` > `updateAllCounters()`的第二个参数一定要指定,否则将出现当前表全部被更新的情况。 [TOC]