Home > Database > Mysql Tutorial > body text

数据库之AR

WBOY
Release: 2016-06-07 15:30:13
Original
1719 people have browsed it

数据库之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->setIsNewRecord(true);</span>

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

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

   C实现原理

实例化 User model

<code><span>$user</span> = <span>new</span> User;</code>
Copy after login

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>-></span>setScenario(<span>$scenario</span>); <span>//设置场景为 insert</span>
    <span>$this</span><span>-></span>setIsNewRecord(<span>true</span>); <span>//设置 这个一条新纪录</span>

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

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

    <span>$this</span><span>-></span>attachBehaviors(<span>$this</span><span>-></span>behaviors()); <span>//绑定行为</span>
    <span>$this</span><span>-></span>afterConstruct(); <span>//触发 构造结束事件</span>
}</code>
Copy after login

   R

<code><span>public</span> <span><span>function</span> <span>actionRead</span><span>()</span>
{</span>
    <span>$user</span> = User::model()->find();
    <span>//这里的场景(Scenario)仍然是update哦</span>
    <span>$user</span> = User::model()->find(<span>'id = :id'</span>,<span>array</span>(<span>':id'</span>=><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()->findAll();

    <span>$user</span> = User::model()->findAll(<span>'id > :lid and id ,<span>array</span>(<span>':lid'</span>=><span>5</span>,<span>':mid'</span>=><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->addCondition('id > :lid');</span>
<span>//        $criteria->addCondition('id 
<span>//        $criteria->addBetweenCondition('id', 5, 10); //包含 5 和 10</span>
<span>//        $criteria->addInCondition('id',array(4,5,6)); </span>
<span>//        $criteria->params = array(':lid'=>5,':mid'=>10);</span>
    <span>$criteria</span>->addSearchCondition(<span>'username'</span>, <span>'g%'</span> ,<span>false</span>);
    <span>$criteria</span>->addSearchCondition(<span>'username'</span>, <span>'g'</span>);
    <span>$criteria</span>->order = <span>'id desc'</span>;
<span>//        $criteria->limit = 2;</span>
<span>//        $criteria->offset = 1;</span>
    <span>$user</span> = User::model()->findAll(<span>$criteria</span>);

    var_dump(<span>$user</span>);
}</span></span></code>
Copy after login

   R实现原理

find()和findall()

<code><span>//创建一个 条件对象  CDbCriteria类</span>
<span>$criteria</span>=<span>$this</span>->getCommandBuilder()
                ->createCriteria(<span>$condition</span>,<span>$params</span>);
<span>//查询</span>
<span>return</span> <span>$this</span>->query(<span>$criteria</span>,<span>true</span>);</code>
Copy after login

   U

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

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

   U实现原理

<code><span>$user</span> = User::model()->findByPk(<span>$id</span>);</code>
Copy after login

调用的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>
Copy after login

调用父类 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>->attachBehaviors(<span>$model</span>->behaviors());
        <span>return</span> <span>$model</span>;
    }
}</code>
Copy after login

   D

<code><span>public</span> <span><span>function</span> <span>actionDelete</span><span>()</span>
{</span>
    <span>$id</span> = Yii::app()->request->getParam(<span>'id'</span>);
    <span>$user</span> = User::model()->findByPk(<span>$id</span>);
    <span>if</span>(<span>$user</span>->delete())
    {
        <span>echo</span> <span>'删除成功'</span>;
    }  <span>else</span> {
        var_dump(<span>$user</span>->errors);
    }
}</code>
Copy after login

   D实现原理

没有什么特别的

<code><span>if</span>(<span>!</span><span>$this</span><span>-></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>-></span>beforeDelete())
    {
        <span>$result</span><span>=</span><span>$this</span><span>-></span>deleteByPk(<span>$this</span><span>-></span>getPrimaryKey())<span>></span><span>0</span>;
        <span>$this</span><span>-></span>afterDelete();
        <span>return</span> <span>$result</span>;
    }
    <span>else</span>
        <span>return</span> <span>false</span>;
}</code>
Copy after login

场景和新纪录

场景(scenario)
新纪录(IsNewRecord)

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

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

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

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

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!