文档章节

Yii2的ActiveRecord与ActiveQuery简单介绍

big_cat
 big_cat
发布于 2016/04/18 16:59
字数 880
阅读 2394
收藏 1
活动记录

        活动记录为与数据库中某张表中的某条记录相关联的对象,我们通过调用此对象的 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();

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

© 著作权归作者所有

共有 人打赏支持
big_cat
粉丝 46
博文 219
码字总数 147544
作品 0
长宁
后端工程师
面向对象的一小步:添加ActiveRecord的Scope功能

问题场景 我们用Yii2的ActiveRecord功能非常的方便,假如我们有个Model叫Student,那么ActiveQuery可以通过这种方式轻便地获得: 然后,我们就可以在$query上继续使用各种方法添加SQL Claus...

米粒人生
07/25
0
0
Yii CDbCriteria 常用方法

Yii CDbCriteria 常用方法 注:$c = new CDbCriteria();是ActiveRecord的一种写法,使ActiveRecord更加灵活,而不是手册中DAO(PDO)和Query Builder。 这是Yii CDbCriteria的一些笔记和常用...

Neo_
2013/10/03
0
0
Castle ActiveRecord学习实践(2):构建配置信息

摘要:ActiveRecord在底层封装了NHibernate,在框架启动时需要指定相关的配置信息,那么我们需要配置些什么?又该如何去配置呢?本文将会介绍在ActiveRecord中构建配置信息。 主要内容 1.需...

邓小峰
2009/03/26
0
0
脱离Rails使用ActiveRecord

ActiveRecord是Ruby的对象-关系映射(ORM)框架,它几乎总是被视为Rails框架的一部分,但其自身也是一个实体,可通过gem单独安装和使用。本文以访问Sqlite3为例,介绍如何在Rails框架之外使用...

redraiment
2014/02/11
0
2
Yii 2 ArrayDataProvider的一些心得

概述 在Yii 2中,页面上用表格显示数据时,一般是用数据提供器(Data Provider)来给表格作为数据源,这个思路就是不管你数据来源是什么,但是最终提供给页面表格显示的时候,其格式和接口都...

tywali
06/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
今天
4
0
现场看路演了!

HiBlock
昨天
14
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
9
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
19
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部