yii的AR查询丰富多样,而手册里的例子只能满足开发的八分之八十,常见的查询形式有:
首先,在模型层 basic/models 目录下新建一个 User.php 模型类,内容如下:
<?php
namespace app\models;
use yii\db\ActiveRecord;
class User extends ActiveRecord {
/**
* 必须重写 tableName 方法,返回表名
* @return string
*/
public static function tableName(){
return "cs_user";
}
}
然后,在控制器层 basic/controllers 目录下新建一个 DemoController.php 控制器,用于测试,内容如下:
<?php
namespace app\controllers;
use yii\web\Controller;
use app\models\UserAR;
class DemoController extends Controller {
/* 数据输入与有效性验证
由于AR继承自yii\base\Model,所以它同样也支持Model的数据输入、验证等特性。例如,你可以声明一个rules方法用来覆盖掉yii\base\Model::rules()里的;你也可以给AR实例批量赋值;你也可以通过调用yii\base\Model::validate()执行数据验证。
当你调用 save()、insert()、update() 这三个方法时,会自动调用yii\base\Model::validate()方法。如果验证失败,数据将不会保存进数据库。 */
/**
* 新增记录
*/
public function actionSave(){
$user = new User();
$user->username = 'tom';
$user->passwd = '123456';
$user->save(); // 通过 new 创建AR对象时,save方法会执行插入操作,也可写成$user->insert();
}
/**
* 查询记录
*/
public function actionQuery(){
// 查询多条记录
//写法1:
$res = User::find()->where(['>','id','3'])
->asArray()
->all();
//写法2:
$res = User::find()->where("id>:id",[":id"=>3])
->asArray()
->all();
// 查询单条记录
// 第一种写法,操作符格式,较安全
$res = User::find()->where(['=','id','1'])
->asArray()
->one();
// 第二种写法,字符串+参数绑定 的形式,防止sql注入
$res = User::find()->where('id=:id', [':id'=>1])
->asArray()
->one();
// 第三种写法,数组的形式,较安全,推荐使用。(但仅限于多个 and 的 等值条件)
$res = User::find()->where(['id'=>1])
->asArray()
->one();
}
/**
* 更新记录
*/
public function actionUpdate(){
// 更新单条记录
$id = 1;
$user = User::findOne($id);
$user->username = 'jack01';
$res = $user->save(); // 如果一个 AR 是由 find 获取的, 则 save() 会执行更新操作
//没有使用的findOne时直接修改属性值,虽然功能也能实现,但是编辑器会出警告,不太友好,可以写成以下写法:
$user = User::find()->where("id>:id and name like :name",[":id"=>20,":name"=>"%$name%"])->one();
$user->attribute["passwd"] = 123;
$user->attribute = $user;
$user->save();
//如果不想编辑器出现黄色提醒且直接修改属性,可在多加一行注释即可:
/** @var $user \Common\models\User */
$user = User::find()->where("id>:id and name like :name",[":id"=>20,":name"=>"%$name%"])->one();
$user->passwd= 123;
$user->save();
// 更新多条记录
User::updateAll(['passwd'=>'123'], 'id>:id', ['id'=>5]); //更新id大于5的记录
// 增量或减量操作
User::updateAllCounters(['age'=>2], 'id>:id', array('id'=>5)); // id大于5的记录,age的值加2
//也可以写成以下方式
User::updateAll("age" => new Expression('age+2')],"id>:id",[":id"=>5]);
}
/**
* 删除记录
*/
public function actionDel(){
// 删除单条记录
$id = 13;
try{
$user = User::findOne($id);
$res = $user->delete(); // 返回影响记录的行数
}catch ($e) {
throw(new Expression($e->getMessage()));
}
// 删除多条记录
// 删除条件采用 字符串形式,并用参数绑定防止sql注入
$id = 8;
$res = User::deleteAll('id > :id', [':id'=>$id]); // 删除 id 大于8的记录,返回影响记录的行数
// 删除条件采用 操作符格式
$id = 10;
$res = User::deleteAll(['>', 'id', $id]); // 删除 id 大于10的记录
}
/**
* 事务的支持,和 DAO 操作类似,这里不作详述
*/
public function trans(){
$db = \Yii::$app->db;
$trans = $db->beginTransaction();
try {
//...
$trans->commit();
return true;
} catch (\Exception $e) {
$trans->rollBack();
return false;
}
}
}