yii中AR增删改查常用方法详情及实例

6 篇文章 0 订阅

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;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值