成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

【ThinkPHP】關(guān)于ThinkPHP關(guān)聯(lián)模型和視圖模型的一些心得

    視圖模型更加類似一張表虛擬的表,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。但是,視圖并不在數(shù)據(jù)庫中以存儲(chǔ)的數(shù)據(jù)值集形式存在。行和列數(shù)據(jù)來自由定義視圖的查詢所引用的表,并且在引用視圖時(shí)動(dòng)態(tài)生成。對(duì)其中所引用的基礎(chǔ)表來說,視圖的作用類似于篩選,這是ThinkPHP手冊(cè)上的說法

創(chuàng)新互聯(lián)公司成立于2013年,先為三水等服務(wù)建站,三水等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為三水企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

    其實(shí)說白了,視圖模型就是MySQL多表查詢而已,視圖模型不支持多表更新,刪除

    而關(guān)聯(lián)模型是多個(gè)表查詢以后的結(jié)果組合,會(huì)多次查詢mysql,(在執(zhí)行完主表查詢以后,會(huì)有個(gè)_after_select)之類的操作,然后組合結(jié)果集。在一些情況下,關(guān)聯(lián)模型的查詢還是比較不錯(cuò)的。

    以下是個(gè)人使用ThinkPHP的關(guān)聯(lián)模型和視圖模型的一些心得和比較

    一:性能方面

      視圖模型,說白了就是關(guān)聯(lián)查詢,一次查詢多表

      關(guān)聯(lián)模型,每次查詢一張表,多次查詢,然后組合結(jié)果集(插入,更新,刪除也是一樣的。)  

      個(gè)人覺得視圖模型性能會(huì)好一些(不一定全部都是,沒有具體測(cè)試過)

    二:查詢

      如果是查詢的話,強(qiáng)烈建議使用視圖模型來做,寫法簡(jiǎn)單,容易理解和更改,而關(guān)聯(lián)模型的定義方式太多,而且結(jié)果集的處理,調(diào)試,都不如視圖模型要方便。

    三:插入,更新,刪除

      視圖模型不支持,關(guān)聯(lián)模型支持,但是在插入,更新的時(shí)候,不能使用Model的create方法,還有自動(dòng)完成,自動(dòng)更新都失效了,我自己重寫了一個(gè)create,給大家一些提示,可以自己按照需要更改。

   

/**
     * 重載create方法,不過濾字段,并且生成需要數(shù)據(jù)
     */
    function create($data = '', $type = '') {
        // 如果沒有傳值默認(rèn)取POST數(shù)據(jù)
        if (empty($data)) {
            $data = $_POST;
        } elseif (is_object($data)) {
            $data = get_object_vars($data);
        }
        // 驗(yàn)證數(shù)據(jù)
        if (empty($data) || !is_array($data)) {
            $this->error = L('_DATA_TYPE_INVALID_');
            return false;
        }
        // 狀態(tài)
        $type = $type ? $type : (!empty($data[$this->getPk() ]) ? self::MODEL_UPDATE : self::MODEL_INSERT);
        // 數(shù)據(jù)自動(dòng)驗(yàn)證
        if (!$this->autoValidation($data, $type)) return false;
        // 表單令牌驗(yàn)證
        if (!$this->autoCheckToken($data)) {
            $this->error = L('_TOKEN_ERROR_');
            return false;
        }
        // 驗(yàn)證完成生成數(shù)據(jù)對(duì)象
        if ($this->autoCheckFields) { // 開啟字段檢測(cè) 則過濾非法字段數(shù)據(jù)
            $fields = $this->getDbFields();
            foreach ($data as $key => $val) {
                if (MAGIC_QUOTES_GPC && is_string($val)) {
                    $data[$key] = stripslashes($val);
                }
            }
        }
        // 創(chuàng)建完成對(duì)數(shù)據(jù)進(jìn)行自動(dòng)處理
        $data=$this->autoOperation($data, $type);
        $data=$this->createData($data);
        // 返回創(chuàng)建的數(shù)據(jù)以供其他調(diào)用
        return $data;
    }

    /**
     * 自動(dòng)表單處理
     * @access public
     * @param array $data 創(chuàng)建數(shù)據(jù)
     * @param string $type 創(chuàng)建類型
     * @return mixed
     */
    private function autoOperation($data, $type) {
        if (!empty($this->options['auto'])) {
            $_auto = $this->options['auto'];
            unset($this->options['auto']);
        } elseif (!empty($this->_auto)) {
            $_auto = $this->_auto;
        }
        // 自動(dòng)填充
        if (isset($_auto)) {
            foreach ($_auto as $auto) {
                // 填充因子定義格式
                // array('field','填充內(nèi)容','填充條件','附加規(guī)則',[額外參數(shù)])
                if (empty($auto[2])) $auto[2] = self::MODEL_INSERT; // 默認(rèn)為新增的時(shí)候自動(dòng)填充
                if ($type == $auto[2] || $auto[2] == self::MODEL_BOTH) {
                    switch (trim($auto[3])) {
                        case 'function': //  使用函數(shù)進(jìn)行填充 字段的值作為參數(shù)
                        case 'callback': // 使用回調(diào)方法
                            $args = isset($auto[4]) ? (array)$auto[4] : array();
                            if (isset($data[$auto[0]])) {
                                array_unshift($args, $data[$auto[0]]);
                            }
                            if ('function' == $auto[3]) {
                                $data[$auto[0]] = call_user_func_array($auto[1], $args);
                            } else {
                                $data[$auto[0]] = call_user_func_array(array(&$this,
                                    $auto[1]
                                ) , $args);
                            }
                            break;
                        case 'field': // 用其它字段的值進(jìn)行填充
                            $data[$auto[0]] = $data[$auto[1]];
                            break;
                        case 'ignore': // 為空忽略
                            if ('' === $data[$auto[0]]) unset($data[$auto[0]]);
                            break;

                        case 'string':
                        default: // 默認(rèn)作為字符串填充
                            $data[$auto[0]] = $auto[1];
                        }
                        if (false === $data[$auto[0]]) unset($data[$auto[0]]);
                    }
            }
        }
        return $data;
    }
    
    /**
     * 生成關(guān)聯(lián)模型需要的數(shù)據(jù)
     */
    function createData($data) {
        foreach ($data as $k => $v) {
            if (in_array($k, $this->fields)) {
                $data['Article'][$k] = $v;
                unset($data[$k]);
            }
        }
        //刪除多余字段
        unset($data['nid']);
        unset($data['create_date']);
        return $data;
    }

    就是直接復(fù)制的原來的create方法,但是去掉了字段過濾,然后自動(dòng)驗(yàn)證,自動(dòng)完成后,createData方法生成最后的數(shù)據(jù),我覺得官方應(yīng)該修改一下這一塊,就更好了。

    

    其他:因?yàn)槲叶x的插入,更新,刪除,查詢等,都是在CommonAction公共類中,如果有特殊條件要使用關(guān)聯(lián)查詢,那么如果用關(guān)聯(lián)視圖的話,還要改成$model->relation(true)->select()的方式,個(gè)人覺得不是很方便,直接視圖模型就不需要更改了。

    

    調(diào)試:視圖模型會(huì)打印關(guān)聯(lián)查詢的全部sql語句,而關(guān)聯(lián)模型,則只會(huì)打印第一條sql語句(因?yàn)樗麄兪菆?zhí)行多條sql語句)


【ThinkPHP】關(guān)于ThinkPHP關(guān)聯(lián)模型和視圖模型的一些心得

標(biāo)題名稱:【ThinkPHP】關(guān)于ThinkPHP關(guān)聯(lián)模型和視圖模型的一些心得
URL標(biāo)題:http://jinyejixie.com/article40/ppeeeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、標(biāo)簽優(yōu)化、微信公眾號(hào)移動(dòng)網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
西畴县| 漯河市| 吉水县| 贡山| 公主岭市| 锦屏县| 广汉市| 宁陕县| 夏河县| 丹凤县| 滁州市| 泾源县| 张家界市| 邵阳市| 敖汉旗| 吴桥县| 都匀市| 永嘉县| 思茅市| 恩施市| 久治县| 长兴县| 桂平市| 丰原市| 都昌县| 河源市| 麻城市| 万山特区| 富裕县| 乌拉特前旗| 皮山县| 阿图什市| 抚州市| 伊春市| 卢湾区| 蛟河市| 南涧| 新源县| 凤山县| 张家港市| 正蓝旗|