文档章节

Yii2的ActiveRecord与ActiveQuery简单介绍

big_cat
 big_cat
发布于 2016/04/18 16:59
字数 880
阅读 7.5K
收藏 1

精选30+云产品,助力企业轻松上云!>>>

活动记录

        活动记录为与数据库中某张表中的某条记录相关联的对象,我们通过调用此对象的 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
粉丝 51
博文 244
码字总数 165998
作品 0
长宁
后端工程师
私信 提问
加载中
请先登录后再评论。
Yii2 ActiveRecord查询初探

梳理一下Yii2中ActiveRecord一次查询的大致流程,理解如下几个问题: (1)ActiveRecord与ActiveQuery何时产生联系; (2)ActiveQuery怎样与数据库连接Connection产生关系; (3)ActiveRec...

osc_ubpucaul
2018/06/17
18
0
Yii2 数据查询

数据查询 User::find()->all(); 此方法返回所有数据; User::findOne($id); 此方法返回 主键 id=1 的一条数据(举个例子); User::find()->where(['name' => '小伙儿'])->one(); 此方法返回 ......

osc_0tk7cpde
2019/04/22
2
0
面向对象的一小步:添加ActiveRecord的Scope功能

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

osc_8ouyb53z
2018/07/25
1
0
面向对象的一小步:添加ActiveRecord的Scope功能

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

米粒人生
2018/07/25
0
0
YII2.0 AcriveRecord的简单使用

这篇文章我们来看看在 Yii2 之中的 Active Record,为啥要将 Active Record 单独出来说呢?因为个人认为这是 Yii(不管是 Yii1.1 还是 Yii2)最强大的一部分功能之一,何况又遇上在 Yii2 中其...

bieru
2015/05/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

你看起来很好吃

你看起来很好吃 本文分享自微信公众号 - ZackSock(ZackSock)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。...

ZackSock
2019/10/25
19
0
Python绘制日历图和热力图

日历热力图 实现某商店2018年10月1号至2019年3月1号期间每一天盈利额(产生5000至30000区间的随机数)的数据可视化。 要求在鼠标放置每个单元格上时显示具体日期和对应数据 import datetime ...

气象学家公众号
07/03
10
0
#乔布简历#计协纳新季福利!乔布简历20元会员卡免费送

#乔布简历#计协纳新季福利!@乔布简历 20元会员卡免费送!活动规则:1)转发本微博/说说@ 三个好友;2)搜索关注“乔布堂”微信公众号,回复“BC016@你的QQ号”;截图发给计协微信公众号:j...

若川
2014/09/22
0
0
第十一届蓝桥第一场省赛题 走方格

走方格 问题描述: 在平面上有一些二维的点阵。这些点的编号就像二维数组的编号一样。从上到下依次为第 1 至第 n 行,从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。现在有...

osc_kf7nv2km
16分钟前
26
0
HTTP/2协议之Stream【原理笔记】

前言 前面三篇介绍了HPPT/2的“连接前言”、“二进制桢”、“头部压缩”。本文从“流及多路复用”、“流状态”、“流量控制”、“流优先级”、“HTTP/2扩展”介绍HTTP/2协议流相关知识。 一、...

瓜农老梁
05/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部