Yii2的ActiveRecord与ActiveQuery简单介绍
博客专区 > big_cat 的博客 > 博客详情
Yii2的ActiveRecord与ActiveQuery简单介绍
big_cat 发表于2年前
Yii2的ActiveRecord与ActiveQuery简单介绍
  • 发表于 2年前
  • 阅读 2249
  • 收藏 1
  • 点赞 1
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: Yii2的ActiveRecord与ActiveQuery简单介绍
活动记录

        活动记录为与数据库中某张表中的某条记录相关联的对象,我们通过调用此对象的 CURD方法对记录进行操作,Yii2的活动记录其实很标准,AR 类为模型Model,对应数据表,AR 类的实例为活动记录,对应表中某条记录。

        在 Yii2 中活动记录为 AR 的实例,对应数据表中的某条记录

        AR 的实例本身作为一条数据表中的记录不应该承担对表级别的操作,所以 Yii2 将此任务赋予了 AR 及其子类(我们自己写model)。我们可以调用相关的 类方法(即静态方法)对表进行检索从而获取我们想要的活动记录,当然,这些静态方法也可以被此模型的实例所使用(静态方法的特性)

ActiveRecord 的 ORM 操作标准:

    1、通过 AR 类访问数据库,检索其所对应的数据表获得符合条件的活动记录

    2、对活动记录进行CURD操作

Yii2 的 AR 是通过调用 AQ 对其所关联的表进行检索操作,以下 AR 方法会返回 AQ 对象

User::find() //生成与当前AR所关联的表的AQ对象
User::findBySql($sql) //根据语句生成相对应AQ对象  $sql = "select * from yii_user where id = 1"

当进行关联查询的时候则是通过已经确定的活动记录对关联表进行条件检索

//关联查询时生成AQ $user->hasOne(Order::className(), ['uid' => 'id']) 将订单表与用户关联
$user->hasMany()
//关联查询时生成AQ $user->hasOne(Order::className(), ['uid' => 'id']) 将订单表与用户关联
$user->hasOne()

AQ则可以通过调用一下方法对数据表进行检索

AQ->where()->groupBy()->having()->orderBy()->offset()->limit()->all()/One();

在最后通过 all 或 one 方法返回符合条件的活动记录(模型的实例),当然也可以使 asArray() 返回数组集合

<?php
namespace app\models;

use yii\db\ActiveRecord;

class User extends ActiveRecord {
    
    public static function tableName() {
        //如果db配置中开启了 tablePrefix => 'tabPre' 的参数设置 这里可以自动返回表全称
        retrun "{{%_tabName}}";
    }
    
    public function getUserOrders() {
        return $this->hasMany(Cart::className(), ['uid' => 'id'])->asArray()->all();
    }
}
?>

<?php
namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\User;

class IndexController extends Controller {
    
    public function actionOrders($id) {
        $user = User::findOne($id); //通过 AR 类对 yii_user 表进行检索返回符合条件的活动记录
        // $user = (new User())->findOne($id); //这样也可以 不过很别扭 一条空活动记录去检索整个表 越权了
        $orders = $user->getUserOrders(); //活动记录调用关联查询获取订单
    }
}
?>

此外 Yii 还可以通过以下方法获取活动记录

User::findOne(['id' => 1]);
User::findAll(['status' => 1]);

TP 的 AR 并不是很标准,TP 自己再 AR 章节也说了,TP 的 AR 类型如下

Database -> ModelObj-> ModelObj->find() -> AR -> AR CURD

恩,严格来说 TP 并没有 ActiveRecord类,所有的对表操作都是基于 Model 类型的,Model 的实例在使用 find()方法后就成为一条 AR 对象.....而且这货还是个多功能的AR对象....

$user = new Home\Model\User(); // D('user')..这里获得一条 Model 的实例.... 
$user->find(1); // 然后这个Model实例就成为了 AR 不要忘了find平时的用法 这里也会返回表记录的数组 
$userInfo = $user->find(1); // 而且这货还可以这样用 直接就给你数组了....
$user->username = "sallency";
$user->save();

看的可能有些晕吧,记住就好......

标签: yii2 AR
共有 人打赏支持
粉丝 46
博文 178
码字总数 132426
×
big_cat
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: