91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ecmall模型實例代碼分析

發布時間:2022-10-18 16:34:58 來源:億速云 閱讀:106 作者:iii 欄目:編程語言

本篇內容介紹了“ecmall模型實例代碼分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

代碼如下:

function &m($model_name, $params = array(), $is_new = false)
 {
     static $models = array();
     $model_hash = md5($model_name . var_export($params, true));
     if ($is_new || !isset($models[$model_hash]))
     {
         $model_file = ROOT_PATH . '/includes/models/' . $model_name . '.model.php';
         if (!is_file($model_file))
         {
            
             return false;
         }
         include_once($model_file);
         $model_name = ucfirst($model_name) . 'Model';
         if ($is_new)
         {
             return new $model_name($params, db());
         }
         $models[$model_hash] = new $model_name($params, db());
       return $models[$model_hash];
 } function &bm($model_name, $params = array(), $is_new = false)
 {
     static $models = array();
     $model_hash = md5($model_name . var_export($params, true));
     if ($is_new || !isset($models[$model_hash]))
     {
         $model_file = ROOT_PATH . '/includes/models/' . $model_name . '.model.php';
         if (!is_file($model_file))
         {
            
             return false;
         }
         include_once($model_file);
         $model_name = ucfirst($model_name) . 'BModel';
         if ($is_new)
         {
             return new $model_name($params, db());
         }
         $models[$model_hash] = new $model_name($params, db());
       return $models[$model_hash];
 }

所謂模型,則是一個一個的數據實體,換句話說就是一個數據表,你可以基于這個模
 型,調用model.base.php中的數據庫操作函數來 對數據進行增、刪、改、查的操作。這里的業務模型,是在實體模型基礎上,再繼承一次,然后對一些方法進行重寫。
 系統中只有三個實體有業務模型:
 推薦類型 recommend;商品數據模型 goods;商品分類業務模型 gcategory;具體操作例子://物品表的操作:
 $model_goods = & m('goods');
 $goods_info = $model_goods->get($goods_id);
這里需要解釋一下對于數據模型的操作是怎樣的一個函數調用過程:
 首先:$model_goods = &m(‘goods’);
 我們看一下&m()函數的代碼,其中var_export()函數則是將傳進來的實體,返回相應的實體類對象,因為所有的model都繼承至 model.base.php中的BaseModel類,這個類中定義了基本所有的操作函數,因此$model_goods對象可以對數據庫進行相應的操作。
 而我們再看看goods.model.php中的GoodsModel的代碼:class GoodsModel extends BaseModel
 {
 var $table = 'goods';
 var $prikey = 'goods_id';
 var $alias = 'g';//縮寫
 var $_name = 'goods';
 var $temp; // 臨時變量
 var $_relation = array(
 // 一個商品對應一條商品統計記錄
 'has_goodsstatistics' => array(
 'model' => 'goodsstatistics',
 'type' => HAS_ONE,
 'foreign_key' => 'goods_id',
 'dependent' => true
 ),
 // 一個商品對應多個規格
 'has_goodsspec' => array(
 'model' => 'goodsspec',
 'type' => HAS_MANY,
 'foreign_key' => 'goods_id',
 'dependent' => true
 ),
 // 一個商品對應一個默認規格
 'has_default_spec' => array(
 'model' => 'goodsspec',
 'type' => HAS_ONE,
 'refer_key' => 'default_spec',
 'foreign_key' => 'spec_id',
 ),
 // 一個商品對應多個屬性
 'has_goodsattr' => array(
 'model' => 'goodsattr',
 'type' => HAS_MANY,
 'foreign_key' => 'goods_id',
 'dependent' => true
 ),
 // 一個商品對應多個圖片
 'has_goodsimage' => array(
 'model' => 'goodsimage',
 'type' => HAS_MANY,
 'foreign_key' => 'goods_id',
 'dependent' => true
 ),
 // 一個商品只能屬于一個店鋪
 'belongs_to_store' => array(
 'model' => 'store',
 'type' => BELONGS_TO,
 'foreign_key' => 'store_id',
 'reverse' => 'has_goods',
 ),
 // 商品和分類是多對多的關系
 'belongs_to_gcategory' => array(
 'model' => 'gcategory',
 'type' => HAS_AND_BELONGS_TO_MANY,
 'middle_table' => 'category_goods',
 'foreign_key' => 'goods_id',
 'reverse' => 'has_goods',
 ),
 // 商品和會員是多對多的關系(會員收藏商品)
 'be_collect' => array(
 'model' => 'member',
 'type' => HAS_AND_BELONGS_TO_MANY,
 'middle_table' => 'collect',
 'foreign_key' => 'item_id',
 'ext_limit' => array('type' => 'goods'),
 'reverse' => 'collect_goods',
 ),
 // 商品和推薦類型是多對多的關系 todo
 'be_recommend' => array(
 'model' => 'recommend',
 'type' => HAS_AND_BELONGS_TO_MANY,
 'middle_table' => 'recommended_goods',
 'foreign_key' => 'goods_id',
 'reverse' => 'recommend_goods',
 ),
 );
 var $_autov = array(
 'goods_name' => array(
 'required' => true,
 'filter' => 'trim',
 ),
 );
 } 這里貼出了實體goods模型類中的內容,先是表格的屬性,再就是goods與其它實體之間的關聯關系的定義。然后我們再看看這個函數,它是 BaseModel構造函數里調用的方法,對對象中的基礎變量進行初使化:
function BaseModel($params, $db)
 {
 $this->db =& $db;
 !$this->alias && $this->alias = $this->table;
 $this->_prefix = DB_PREFIX;
 $this->table = $this->_prefix . $this->table;
 if (!emptyempty($params))
 {
 foreach ($params as $key => $value)
 {
 $this->$key = $value;
 }
 }
 }大家已經看出$_relation 中間是此實體的關聯信息,然后在BaseModel類中的一個函數:
function _getJoinString($relation_info)
 {
 switch ($relation_info['type'])
 {
 case HAS_ONE://
 $model =& m($relation_info['model']);

 $ext_limit = '';
 $relation_info['ext_limit'] && $ext_limit = ' AND ' . $this->_getExtLimit($relation_info['ext_limit']);

 $refer_key = isset($relation_info['refer_key']) ? $relation_info['refer_key'] : $this->prikey;

 return " LEFT JOIN {$model->table} {$model->alias} ON {$this->alias}.{$refer_key}={$model->alias}.{$relation_info['foreign_key']}{$ext_limit}";
 break;
 case BELONGS_TO:

 $model =& m($relation_info['model']);
 $be_related = $model->getRelation($relation_info['reverse']);
 if (emptyempty($be_related))
 {

 $this->_error('no_reverse_be_found', $relation_info['model']);
 return '';
 }
 $ext_limit = '';
 !emptyempty($relation_info['ext_limit']) && $ext_limit = ' AND ' . $this->_getExtLimit($relation_info['ext_limit'], $this->alias);

 $refer_key = isset($be_related['refer_key']) ? $be_related['refer_key'] :$model->prikey ;

 return " LEFT JOIN {$model->table} {$model->alias} ON {$this->alias}.{$be_related['foreign_key']} = {$model->alias}.{$refer_key}{$ext_limit}";
 break;
 case HAS_AND_BELONGS_TO_MANY:

 $malias = isset($relation_info['alias']) ? $relation_info['alias'] : $relation_info['middle_table'];
 $ext_limit = '';
 $relation_info['ext_limit'] && $ext_limit = ' AND ' . $this->_getExtLimit($relation_info['ext_limit'], $malias);
 return " LEFT JOIN {$this->_prefix}{$relation_info['middle_table']} {$malias} ON {$this->alias}.{$this->prikey} = {$malias}.{$relation_info['foreign_key']}{$ext_limit}";
 break;
 }
 }

 define('HAS_ONE', 1); //一對一關聯
 define('BELONGS_TO', 2); //屬于關聯
 define('HAS_MANY', 3); //一對多關聯
 define('HAS_AND_BELONGS_TO_MANY', 4); //多對多關聯
 define('DROP_CONDITION_TRUNCATE', 'TRUNCATE'); // 清空 從這個函數中,我們可以看到,對于不同的關聯關系,它會返回不同的關聯時的查詢語句片斷,然后連接上主sql語句,就可以針對實體的關聯實體進行相應的關聯操作了。
//物品表的操作:
 $model_goods = & m('goods');
 $goods_info = $model_goods->find(array(
 'conditions' => "if_show=1 and closed=0",
 'fields' => 'goods_id,goods_name,s.store_id,s.store_name',
 'join' => 'blongs_to_store'
 ));這里的’join’ => ‘blongs_to_store’ ,我們從上面的:
// 一個商品只能屬于一個店鋪
 'belongs_to_store' => array(
 'model' => 'store',
 'type' => BELONGS_TO,
 'foreign_key' => 'store_id',
 'reverse' => 'has_goods',
 ),這里我們可以知道這是在與store表進行關聯查找了。
 到這里,讀者就可以知道,如果在上面進行二次開發的話,怎樣進行數據庫操作就已經很 明確的了。
 在BaseModel與cls_mysql(mysql.php)中,有很多的有關數據操作的函數,這里就不需要再一一進行解釋了,而在cls_mysql中,有一些更基礎的操作函數,還有仿真 Adodb 的函數,可以直接跳過BaseModel中的函數
 以上介紹了如何在 ecmall的平臺上進行數據庫操作,如果操作更加的復雜,這里還有一種更加直接的方法:$sql = "select g.goods_id,g.goods_name, from ".DB_PREFIX."goods g, ".DB_PREFIX."goods_spec gs , ".DB_PREFIX."store s where cate_id='".$cate_id."' AND g.if_show = 1 AND g.closed = 0 and g.goods_id=gs.goods_id and g.store_id=s.store_id and gs.stock>0 and s.state=1 order by g.add_time desc limit 6";
 $goods_mod =& m('goods');
 $category_goods = $goods_mod->getAll($sql);
 if(!$category_goods){
 $category_goods=array();
 }
 return $category_goods;就可以直接使用sql語句進行數據操作了。
 還可以在BaseModel中定義自己的操作方法,其中可以使用$this->db->(cls_mysql中定義的方法) 來調用cls_mysql中的函數,從而可以添加更加復雜的數據操作函數。

“ecmall模型實例代碼分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

上犹县| 罗江县| 汪清县| 临猗县| 正安县| 卫辉市| 武汉市| 资溪县| 高邮市| 甘谷县| 安丘市| 瑞安市| 班戈县| 武乡县| 浮梁县| 云龙县| 赤城县| 郓城县| 南澳县| 灵台县| 林口县| 宿松县| 厦门市| 永州市| 霍山县| 湾仔区| 平昌县| 郯城县| 界首市| 油尖旺区| 阿坝县| 淄博市| 灵丘县| 嘉峪关市| 开阳县| 长汀县| 顺义区| 平南县| 木兰县| 龙州县| 基隆市|