日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

ECMALL数据库关系模型的实现

發(fā)布時(shí)間:2025/1/21 数据库 93 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ECMALL数据库关系模型的实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

所謂模型,則是一個(gè)一個(gè)的數(shù)據(jù)實(shí)體,換句話說(shuō)就是一個(gè)數(shù)據(jù)表,你可以基于這個(gè)模

型,調(diào)用model.base.php中的數(shù)據(jù)庫(kù)操作函數(shù)來(lái)對(duì)數(shù)據(jù)進(jìn)行增、刪、改、查的操作。

這里的業(yè)務(wù)模型,是在實(shí)體模型基礎(chǔ)上,再繼承一次,然后對(duì)一些方法進(jìn)行重寫(xiě)。

系統(tǒng)中只有三個(gè)實(shí)體有業(yè)務(wù)模型:

推薦類型 recommend;商品數(shù)據(jù)模型 goods;商品分類業(yè)務(wù)模型 gcategory;

具體操作例子:

//物品表的操作:

$model_goods = & m(‘goods’);

$goods_info = $model_goods->get($goods_id); 這里需要解釋一下對(duì)于數(shù)據(jù)模型的操作是怎樣的一個(gè)函數(shù)調(diào)用過(guò)程:

首先:$model_goods = &m(‘goods’);

對(duì)于數(shù)據(jù)庫(kù)關(guān)系模型的分析,我覺(jué)得需要從兩個(gè)函數(shù)說(shuō)起:

  • //獲取一個(gè)模型
  • 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))
  • {
  • /* 不存在該文件,則無(wú)法獲取模型 */
  • 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];
  • }
  • //獲取一個(gè)業(yè)務(wù)模型
  • 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))
  • {
  • /* 不存在該文件,則無(wú)法獲取模型 */
  • 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];
  • }
  • 我們看一下&m()函數(shù)的代碼,其中var_export()函數(shù)則是將傳進(jìn)來(lái)的實(shí)體,返回相應(yīng)的實(shí)體類對(duì)象,因?yàn)樗械膍odel都繼承至model.base.php中的BaseModel類,這個(gè)類中定義了基本所有的操作函數(shù),因此$model_goods對(duì)象可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行相應(yīng)的操作。

    而我們?cè)倏纯磄oods.model.php中的GoodsModel的代碼:

  • class GoodsModel extends BaseModel
  • {
  • var $table = ‘goods';
  • var $prikey = ‘goods_id';
  • var $alias = ‘g';//縮寫(xiě)
  • var $_name = ‘goods';
  • var $temp; // 臨時(shí)變量
  • var $_relation = array(
  • // 一個(gè)商品對(duì)應(yīng)一條商品統(tǒng)計(jì)記錄
  • ‘has_goodsstatistics’ => array(
  • ‘model’ => ‘goodsstatistics’,
  • ‘type’ => HAS_ONE,
  • ‘foreign_key’ => ‘goods_id’,
  • ‘dependent’ => true
  • ),
  • // 一個(gè)商品對(duì)應(yīng)多個(gè)規(guī)格
  • ‘has_goodsspec’ => array(
  • ‘model’ => ‘goodsspec’,
  • ‘type’ => HAS_MANY,
  • ‘foreign_key’ => ‘goods_id’,
  • ‘dependent’ => true
  • ),
  • // 一個(gè)商品對(duì)應(yīng)一個(gè)默認(rèn)規(guī)格
  • ‘has_default_spec’ => array(
  • ‘model’ => ‘goodsspec’,
  • ‘type’ => HAS_ONE,
  • ‘refer_key’ => ‘default_spec’,
  • ‘foreign_key’ => ‘spec_id’,
  • ),
  • // 一個(gè)商品對(duì)應(yīng)多個(gè)屬性
  • ‘has_goodsattr’ => array(
  • ‘model’ => ‘goodsattr’,
  • ‘type’ => HAS_MANY,
  • ‘foreign_key’ => ‘goods_id’,
  • ‘dependent’ => true
  • ),
  • // 一個(gè)商品對(duì)應(yīng)多個(gè)圖片
  • ‘has_goodsimage’ => array(
  • ‘model’ => ‘goodsimage’,
  • ‘type’ => HAS_MANY,
  • ‘foreign_key’ => ‘goods_id’,
  • ‘dependent’ => true
  • ),
  • // 一個(gè)商品只能屬于一個(gè)店鋪
  • ‘belongs_to_store’ => array(
  • ‘model’ => ‘store’,
  • ‘type’ => BELONGS_TO,
  • ‘foreign_key’ => ‘store_id’,
  • ‘reverse’ => ‘has_goods’,
  • ),
  • // 商品和分類是多對(duì)多的關(guān)系
  • ‘belongs_to_gcategory’ => array(
  • ‘model’ => ‘gcategory’,
  • ‘type’ => HAS_AND_BELONGS_TO_MANY,
  • ‘middle_table’ => ‘category_goods’,
  • ‘foreign_key’ => ‘goods_id’,
  • ‘reverse’ => ‘has_goods’,
  • ),
  • // 商品和會(huì)員是多對(duì)多的關(guān)系(會(huì)員收藏商品)
  • ‘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’,
  • ),
  • // 商品和推薦類型是多對(duì)多的關(guān)系 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’,
  • ),
  • );
  • }
  • 這里貼出了實(shí)體goods模型類中的內(nèi)容,先是表格的屬性,再就是goods與其它實(shí)體之間的關(guān)聯(lián)關(guān)系的定義。然后我們?cè)倏纯催@個(gè)函數(shù),它是BaseModel構(gòu)造函數(shù)里調(diào)用的方法,對(duì)對(duì)象中的基礎(chǔ)變量進(jìn)行初使化:

  • 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;
  • }
  • }
  • }
  • 大家已經(jīng)看出$_relation 中間是此實(shí)體的關(guān)聯(lián)信息,然后在BaseModel類中的一個(gè)函數(shù):

  • function _getJoinString($relation_info)
  • {
  • switch ($relation_info['type'])
  • {
  • case HAS_ONE://
  • $model =& m($relation_info['model']);
  • /* 聯(lián)合限制 */
  • $ext_limit = ”;
  • $relation_info['ext_limit'] && $ext_limit = ‘ AND ‘ . $this->_getExtLimit($relation_info['ext_limit']);
  • /* 獲取參考鍵,默認(rèn)是本表主鍵(直接擁有),否則為間接擁有 */
  • $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:
  • /* 屬于關(guān)系與擁有是一個(gè)反向的關(guān)系 */
  • $model =& m($relation_info['model']);
  • $be_related = $model->getRelation($relation_info['reverse']);
  • if (emptyempty($be_related))
  • {
  • /* 沒(méi)有找到反向關(guān)系 */
  • $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);
  • /* 獲取參考鍵,默認(rèn)是外表主鍵 */
  • $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;
  • }
  • }
  • /* 模型相關(guān)常量定義 */
  • define(‘HAS_ONE’, 1); //一對(duì)一關(guān)聯(lián)
  • define(‘BELONGS_TO’, 2); //屬于關(guān)聯(lián)
  • define(‘HAS_MANY’, 3); //一對(duì)多關(guān)聯(lián)
  • define(‘HAS_AND_BELONGS_TO_MANY’, 4); //多對(duì)多關(guān)聯(lián)
  • define(‘DROP_CONDITION_TRUNCATE’, ‘TRUNCATE’); //清空
  • 從這個(gè)函數(shù)中,我們可以看到,對(duì)于不同的關(guān)聯(lián)關(guān)系,它會(huì)返回不同的關(guān)聯(lián)時(shí)的查詢語(yǔ)句片斷,然后連接上主sql語(yǔ)句,就可以針對(duì)實(shí)體的關(guān)聯(lián)實(shí)體進(jìn)行相應(yīng)的關(guān)聯(lián)操作了。

  • //物品表的操作:
  • $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’ ,我們從上面的:
  • // 一個(gè)商品只能屬于一個(gè)店鋪
  • ‘belongs_to_store’ => array(
  • ‘model’ => ‘store’,
  • ‘type’ => BELONGS_TO,
  • ‘foreign_key’ => ‘store_id’,
  • ‘reverse’ => ‘has_goods’,
  • ),
  • 這里我們可以知道這是在與store表進(jìn)行關(guān)聯(lián)查找了。ECmall二次開(kāi)發(fā)

    到這里,讀者就可以知道,如果在上面進(jìn)行二次開(kāi)發(fā)的話,怎樣進(jìn)行數(shù)據(jù)庫(kù)操作就已經(jīng)很明確的了。

    在BaseModel與cls_mysql(mysql.php)中,有很多的有關(guān)數(shù)據(jù)操作的函數(shù),這里就不需要再一一進(jìn)行解釋了,而在cls_mysql中,有一些更基礎(chǔ)的操作函數(shù),還有仿真 Adodb 的函數(shù),可以直接跳過(guò)BaseModel中的函數(shù)

    以上介紹了如何在ecmall的平臺(tái)上進(jìn)行數(shù)據(jù)庫(kù)操作,如果操作更加的復(fù)雜,這里還有一種更加直接的方法:

  • $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語(yǔ)句進(jìn)行數(shù)據(jù)操作了。

    還可以在BaseModel中定義自己的操作方法,其中可以使用$this->db->(cls_mysql中定義的方法) 來(lái)調(diào)用cls_mysql中的函數(shù),從而可以添加更加復(fù)雜的數(shù)據(jù)操作函數(shù)。

    轉(zhuǎn)載于:https://my.oschina.net/winnsay/blog/633499

    總結(jié)

    以上是生活随笔為你收集整理的ECMALL数据库关系模型的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲欧美精品suv | 中国av免费 | 91亚洲精品久久久久久久久久久久 | 国产东北真实交换多p免视频 | 国产无码精品视频 | 欧美69精品久久久久久不卡 | 亚洲成人播放 | 久久精品专区 | 国产精品视频一区二区三 | eeuss国产一区二区三区 | 韩国明星乱淫(高h)小说 | 中日韩精品一区二区三区 | 久久久免费网站 | 97神马影院 | 亚洲av成人无码一区二区三区在线观看 | 伊人网成人网 | 天天舔天天摸 | 好男人影视www | 黑丝国产在线 | 天天操天天爽天天干 | sese久久 | 在线播放视频高清在线观看 | 色涩网站 | 杨贵妃颤抖双乳呻吟求欢小说 | av日韩在线播放 | 午夜影音 | 狠狠干免费视频 | 黄色一级片免费观看 | 美女av一区二区 | 日日插日日操 | 国产在线视频你懂的 | 国产无毛片 | 欧美一区成人 | 色多多污| 久久久久久无码午夜精品直播 | 性感美女被爆操 | 美女隐私免费观看 | 99精品视频免费在线观看 | 亚洲黄色影院 | 成人网址在线观看 | 日韩视频播放 | 久久精品中文闷骚内射 | 日操干| 人人澡人人爽 | 中字幕视频在线永久在线观看免费 | 免费黄色三级网站 | h片大全| 女同亚洲精品一区二区三 | 成人欧美一区二区三区在线播放 | 一级a性色生活片久久无 | 国产人妖一区 | 欧美大喷水吹潮合集在线观看 | 色男人的天堂 | 久久久精品视频在线观看 | 男插女青青影院 | 亚洲激情自拍偷拍 | exo妈妈mv在线播放高清免费 | 天天视频入口 | 中文字幕在线观看av | 日本色网址 | 精品精品 | 视频免费在线 | 国产精品午夜电影 | 欧美一级淫片免费 | 做视频| 在线免费亚洲 | 乱子伦视频在线看 | 理想之城连续剧40集免费播放 | 国产jk精品白丝av在线观看 | 粉色视频免费观看 | 麻豆av在线 | 欧美一级无毛 | 欧美国产一区二区在线观看 | www.97视频 | 久久这里只有 | 日韩中文字幕二区 | 美女黄视频大全 | 欧美久久久久久久久中文字幕 | 国产二区一区 | xxxx18日本| 久久精品欧美一区二区三区麻豆 | 欧美综合视频在线观看 | 可以在线观看的av | 一级欧美一级日韩 | 中文字幕――色哟哟 | 国产高清一区二区三区四区 | 亚洲成人a√ | 久久亚洲熟女cc98cm | 久久久国产精品久久久 | 在线播放国产精品 | 亚洲av无码国产综合专区 | 欧美日韩一级在线观看 | 中文字幕午夜 | 超碰丝袜| 中文字幕在线日韩 | 久久精品人妻一区二区 | 人妻丝袜一区二区三区 | 国产精品免费视频一区二区三区 | 国产精品www. |