目錄
数据库之AR
gii
CRUD
   C
   C实现原理
   R
   R实现原理
   U
   U实现原理
   D
   D实现原理
场景和新纪录
首頁 資料庫 mysql教程 数据库之AR

数据库之AR

Jun 07, 2016 pm 03:30 PM
active record 物件 資料庫

数据库之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

<code><span>public</span> <span><span>function</span> <span>actionCreate</span><span>()</span>
{</span>
    <span>//$user = new User; //实例化userModel</span>
    <span>//或</span>
    <span>//$user = User::model();</span>
    <span>//$user-&gt;setIsNewRecord(true);</span>

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

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

   C实现原理

实例化 User model

<code><span>$user</span> = <span>new</span> User;</code>
登入後複製

User extends CActiveRecord 调用 CActiveRecord的构造方法

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

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

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

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

    <span>$this</span><span>-&gt;</span>attachBehaviors(<span>$this</span><span>-&gt;</span>behaviors()); <span>//绑定行为</span>
    <span>$this</span><span>-&gt;</span>afterConstruct(); <span>//触发 构造结束事件</span>
}</code>
登入後複製

   R

<code><span>public</span> <span><span>function</span> <span>actionRead</span><span>()</span>
{</span>
    <span>$user</span> = User::model()-&gt;find();
    <span>//这里的场景(Scenario)仍然是update哦</span>
    <span>$user</span> = User::model()-&gt;find(<span>'id = :id'</span>,<span>array</span>(<span>':id'</span>=&gt;<span>5</span>));
    var_dump(<span>$user</span>);
}

<span>public</span> <span><span>function</span> <span>actionReadAll</span><span>()</span>
{</span>
    <span>$user</span> = User::model()-&gt;findAll();

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

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

    var_dump(<span>$user</span>);
}</span></span></code>
登入後複製

   R实现原理

find()和findall()

<code><span>//创建一个 条件对象  CDbCriteria类</span>
<span>$criteria</span>=<span>$this</span>-&gt;getCommandBuilder()
                -&gt;createCriteria(<span>$condition</span>,<span>$params</span>);
<span>//查询</span>
<span>return</span> <span>$this</span>-&gt;query(<span>$criteria</span>,<span>true</span>);</code>
登入後複製

   U

<code><span>public</span> <span><span>function</span> <span>actionUpdate</span><span>()</span>
{</span>
    <span>$id</span> = Yii::app()-&gt;request-&gt;getParam(<span>'id'</span>);
    <span>$user</span> = User::model()-&gt;findByPk(<span>$id</span>);
    <span>$user</span>-&gt;username = <span>"被我改了吧"</span>;

    <span>//这里值得细说的是 IsNewRecord变量为false</span>
    <span>//场景(scenario)为update</span>
    <span>//具体看 实现原理</span>
    <span>if</span>(<span>$user</span>-&gt;save())
    {
        <span>echo</span> <span>'修改成功'</span>;
    }<span>else</span>
    {
        var_dump(<span>$user</span>-&gt;errors);
    }
}</code>
登入後複製

   U实现原理

<code><span>$user</span> = User::model()-&gt;findByPk(<span>$id</span>);</code>
登入後複製

调用的User的 静态方法model

<code><span>public</span> <span>static</span> <span><span>function</span> <span>model</span><span>(<span>$className</span>=__CLASS__)</span>
{</span>
    <span>return</span> <span>parent</span>::model(<span>$className</span>);
}</code>
登入後複製

调用父类 CActiveRecord 类的 model方法

<code><span>public</span> <span>static</span> <span><span>function</span> <span>model</span><span>(<span>$className</span>=__CLASS__)</span>
{</span>
    <span>if</span>(<span>isset</span>(<span>self</span>::<span>$_models</span>[<span>$className</span>]))
        <span>return</span> <span>self</span>::<span>$_models</span>[<span>$className</span>];
    <span>else</span>
    {
                          <span>//实例化类</span>
        <span>$model</span>=<span>self</span>::<span>$_models</span>[<span>$className</span>]=<span>new</span> <span>$className</span>(<span>null</span>);
                          <span>//绑定行为</span>
        <span>$model</span>-&gt;attachBehaviors(<span>$model</span>-&gt;behaviors());
        <span>return</span> <span>$model</span>;
    }
}</code>
登入後複製

   D

<code><span>public</span> <span><span>function</span> <span>actionDelete</span><span>()</span>
{</span>
    <span>$id</span> = Yii::app()-&gt;request-&gt;getParam(<span>'id'</span>);
    <span>$user</span> = User::model()-&gt;findByPk(<span>$id</span>);
    <span>if</span>(<span>$user</span>-&gt;delete())
    {
        <span>echo</span> <span>'删除成功'</span>;
    }  <span>else</span> {
        var_dump(<span>$user</span>-&gt;errors);
    }
}</code>
登入後複製

   D实现原理

没有什么特别的

<code><span>if</span>(<span>!</span><span>$this</span><span>-&gt;</span>getIsNewRecord())
{
    Yii<span>::trace</span>(get_class(<span>$this</span>)<span>.</span><span>'.delete()'</span>,<span>'system.db.ar.CActiveRecord'</span>);
    <span>if</span>(<span>$this</span><span>-&gt;</span>beforeDelete())
    {
        <span>$result</span><span>=</span><span>$this</span><span>-&gt;</span>deleteByPk(<span>$this</span><span>-&gt;</span>getPrimaryKey())<span>&gt;</span><span>0</span>;
        <span>$this</span><span>-&gt;</span>afterDelete();
        <span>return</span> <span>$result</span>;
    }
    <span>else</span>
        <span>return</span> <span>false</span>;
}</code>
登入後複製

场景和新纪录

场景(scenario)
新纪录(IsNewRecord)

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

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

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

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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Go語言如何實作資料庫的增刪改查操作? Go語言如何實作資料庫的增刪改查操作? Mar 27, 2024 pm 09:39 PM

Go語言如何實作資料庫的增刪改查操作?

如何將 MySQL 查詢結果陣列轉換為物件? 如何將 MySQL 查詢結果陣列轉換為物件? Apr 29, 2024 pm 01:09 PM

如何將 MySQL 查詢結果陣列轉換為物件?

在PHP中使用MySQLi建立資料庫連線的詳盡教學 在PHP中使用MySQLi建立資料庫連線的詳盡教學 Jun 04, 2024 pm 01:42 PM

在PHP中使用MySQLi建立資料庫連線的詳盡教學

Amazfit 更新推出 GTR 4、GTS 4 等智慧手錶 Amazfit 更新推出 GTR 4、GTS 4 等智慧手錶 Aug 17, 2024 pm 09:33 PM

Amazfit 更新推出 GTR 4、GTS 4 等智慧手錶

數組和物件在 PHP 中的差異是什麼? 數組和物件在 PHP 中的差異是什麼? Apr 29, 2024 pm 02:39 PM

數組和物件在 PHP 中的差異是什麼?

Hibernate 如何實作多型映射? Hibernate 如何實作多型映射? Apr 17, 2024 pm 12:09 PM

Hibernate 如何實作多型映射?

iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 Jul 18, 2024 am 05:48 AM

iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片

C++ 函式回傳物件時有什麼需要注意的? C++ 函式回傳物件時有什麼需要注意的? Apr 19, 2024 pm 12:15 PM

C++ 函式回傳物件時有什麼需要注意的?

See all articles