热门标签 | HotTags
当前位置:  开发笔记 > 开放平台 > 正文

数据库之AR

数据库之ARActiveRecord(AR)是一个流行的对象-关系映射(ORM)技术。每个AR类代表一个数据表(或视图),数据表(或视图)的列在AR类中体现为类的属性,一个AR实例则表示表中的一行。–yiichina数据库之ARgiiCRUDCC实现原理RR实现原理

数据库之AR Active Record (AR) 是一个流行的 对象-关系映射 (ORM) 技术。 每个 AR 类代表一个数据表(或视图),数据表(或视图)的列在 AR 类中体现为类的属性,一个 AR 实例则表示表中的一行。 – yiichina 数据库之AR gii CRUD C C实现原理 R R实现原理

数据库之AR

Active Record (AR) 是一个流行的 对象-关系映射 (ORM) 技术。 每个 AR 类代表一个数据表(或视图),数据表(或视图)的列在 AR 类中体现为类的属性,一个 AR 实例则表示表中的一行。
– yiichina

  • 数据库之AR
  • gii
  • CRUD
  • C
  • C实现原理
  • R
  • R实现原理
  • U
  • U实现原理
  • D
  • D实现原理
  • 场景和新纪录

gii

这里简单提一下gii 具体百度一下,你就知道
是YII的代码生成工具
下面使用的User类就是gii生成的

CRUD C
public function actionCreate()
{
    //$user = new User; //实例化userModel
    //或
    //$user = User::model();
    //$user->setIsNewRecord(true);

    //给对应的字段赋值
    $user->username = "框架";
    $user->status = 0;
    $user->city = 5;

    //插入数据
    //这里值得细说的是 IsNewRecord变量为true
    //场景(scenario)为insert 
    //具体看 实现原理
    if($user->save())
    {
        echo '插入成功';
    }else
    {
        var_dump($user->errors);
    }
}
C实现原理

实例化 User model

$user = new User;

User extends CActiveRecord 调用 CActiveRecord的构造方法

public function __construct($scenario='insert')
{
    //使用 静态方法 model实例化对象 场景(scenario)为空
    if($scenario===null) // internally used by populateRecord() and model()
        return;

    $this->setScenario($scenario); //设置场景为 insert
    $this->setIsNewRecord(true); //设置 这个一条新纪录

    //获得字段的默认值
    $this->_attributes=$this->getMetaData()->attributeDefaults; 

    $this->init(); //一个空方法 子类可以自己重写

    $this->attachBehaviors($this->behaviors()); //绑定行为
    $this->afterConstruct(); //触发 构造结束事件
}
R
public function actionRead()
{
    $user = User::model()->find();
    //这里的场景(Scenario)仍然是update哦
    $user = User::model()->find('id = :id',array(':id'=>5));
    var_dump($user);
}

public function actionReadAll()
{
    $user = User::model()->findAll();

    $user = User::model()->findAll('id > :lid and id <:mid',array(':lid'=>5,':mid'=>10));
    var_dump($user);
}

public function actionReadCriteria()
{
    $criteria = new CDbCriteria();
//        $criteria->addCondition('id > :lid');
//        $criteria->addCondition('id <:mid');
//        $criteria->addBetweenCondition('id', 5, 10); //包含 5 和 10
//        $criteria->addInCondition('id',array(4,5,6)); 
//        $criteria->params = array(':lid'=>5,':mid'=>10);
    $criteria->addSearchCondition('username', 'g%' ,false);
    $criteria->addSearchCondition('username', 'g');
    $criteria->order = 'id desc';
//        $criteria->limit = 2;
//        $criteria->offset = 1;
    $user = User::model()->findAll($criteria);

    var_dump($user);
}
R实现原理

find()和findall()

//创建一个 条件对象  CDbCriteria类
$criteria=$this->getCommandBuilder()
                ->createCriteria($condition,$params);
//查询
return $this->query($criteria,true);
U
public function actionUpdate()
{
    $id = Yii::app()->request->getParam('id');
    $user = User::model()->findByPk($id);
    $user->username = "被我改了吧";

    //这里值得细说的是 IsNewRecord变量为false
    //场景(scenario)为update
    //具体看 实现原理
    if($user->save())
    {
        echo '修改成功';
    }else
    {
        var_dump($user->errors);
    }
}
U实现原理
$user = User::model()->findByPk($id);

调用的User的 静态方法model

public static function model($className=__CLASS__)
{
    return parent::model($className);
}

调用父类 CActiveRecord 类的 model方法

public static function model($className=__CLASS__)
{
    if(isset(self::$_models[$className]))
        return self::$_models[$className];
    else
    {
                          //实例化类
        $model=self::$_models[$className]=new $className(null);
                          //绑定行为
        $model->attachBehaviors($model->behaviors());
        return $model;
    }
}
D
public function actionDelete()
{
    $id = Yii::app()->request->getParam('id');
    $user = User::model()->findByPk($id);
    if($user->delete())
    {
        echo '删除成功';
    }  else {
        var_dump($user->errors);
    }
}
D实现原理

没有什么特别的

if(!$this->getIsNewRecord())
{
    Yii::trace(get_class($this).'.delete()','system.db.ar.CActiveRecord');
    if($this->beforeDelete())
    {
        $result=$this->deleteByPk($this->getPrimaryKey())>0;
        $this->afterDelete();
        return $result;
    }
    else
        return false;
}
场景和新纪录

场景(scenario)
新纪录(IsNewRecord)

1.场景的作用更多体现在 insert 和 update上,这也是默认的场景只有insert和update

new User() 场景被赋值成insert
User::model()query()的时候 调用 populateRecords()赋值成update

节选自yiichina网友的一片博文,比较好的描述了yii中场景的作用

2.新纪录一般用来区别insert和其他操作

推荐阅读
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 本文详细探讨了HTTP 500内部服务器错误的成因、解决方案及其在Web开发中的影响。通过对具体案例的分析,帮助读者理解并解决此类问题。 ... [详细]
  • 在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ... [详细]
  • 百度服务再次遭遇技术问题,疑似DNS解析故障
    近日晚间,百度多项在线服务出现加载异常,包括移动端搜索在内的多个功能受到影响。初步迹象表明,问题可能与DNS服务器解析有关。 ... [详细]
  • 自媒体创作必备工具与软件推荐
    本文将详细介绍自媒体创作者所需的各类工具和软件,包括视频制作、剪辑、发布平台管理等方面的专业建议。 ... [详细]
  • 探讨如何使用工具或方法来自定义百度网盘的提取码,以提高文件分享的安全性和便捷性。 ... [详细]
  • 摘要:为了解决下载速度慢的问题,本文介绍了一种高效的下载方法,并提供了详细的步骤和工具推荐。通过使用百度网盘分享功能,可以显著提高文件传输效率。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 通过与阿里云的合作,牛客网成功解决了跨国视频面试中的网络卡顿问题,为求职者和面试官提供了更加流畅的沟通体验。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 揭秘:为何我的网名是老紫竹
    本文详细解释了作者为何选择“老紫竹”作为网名,从个人喜好到网络经历,以及与紫竹植物的渊源。 ... [详细]
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • 本文介绍了一种有效的方法来检测硬盘上的视频文件是否损坏或存在缺帧问题。虽然一些常见的搜索引擎并未提供专门的工具,但通过使用FFmpeg等专业软件,可以全面验证各种视频格式的数据完整性,包括较为古老的AVI格式。 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
author-avatar
荧光绿的包包
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有