数据库之AR

WBOY
リリース: 2016-06-07 15:30:13
オリジナル
1718 人が閲覧しました

数据库之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>
ログイン後にコピー

   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>-></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>
ログイン後にコピー

   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>
ログイン後にコピー

   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>
ログイン後にコピー

   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>
ログイン後にコピー

   U实现原理

<code><span>$user</span> = User::model()->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>->attachBehaviors(<span>$model</span>->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()->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>
ログイン後にコピー

   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>
ログイン後にコピー

场景和新纪录

场景(scenario)
新纪录(IsNewRecord)

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

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

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

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!