mall原始碼簡略分析 資料庫關係模型的實現

2021-06-06 09:37:56 字數 4069 閱讀 8253

對於資料庫關係模型的分析,我覺得需要從兩個函式說起:

//獲取乙個模型

function &m($model_name, $params = array(), $is_new = false)

include_once($model_file);

$model_name = ucfirst($model_name) . 'model';

if ($is_new)

$models[$model_hash] = new $model_name($params, db());

}return $models[$model_hash];

}//獲取乙個業務模型

function &bm($model_name, $params = array(), $is_new = false)

include_once($model_file);

$model_name = ucfirst($model_name) . 'bmodel';

if ($is_new)

$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

複製**

這裡貼出了實體goods模型類中的內容,先是**的屬性,再就是goods與其它實體之間的關聯關係的定義。然後我們再看看這個函式,它是basemodel建構函式裡呼叫的方法,對物件中的基礎變數進行初使化:

function basemodel($params, $db)}}

複製**

function _getjoinstring($relation_info)

on .=.";

break;

case belongs_to:

$model =& m($relation_info['model']);

$be_related = $model->getrelation($relation_info['reverse']);

if (emptyempty($be_related))

$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 on . = .";

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 on . = .";

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表進行關聯查詢了。ecmall二次開發

到這裡,讀者就可以知道,如果在上面進行二次開發的話,怎樣進行資料庫操作就已經很明確的了。

在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)

return $category_goods;

複製**

就可以直接使用sql語句進行資料操作了。

還可以在basemodel中定義自己的操作方法,其中可以使用$this->db->(cls_mysql中定義的方法) 來呼叫cls_mysql中的函式,從而可以新增更加複雜的資料操作函式。

資料庫連線池Hikaricp原始碼分析

hikaricp總結 借助哪些技術使效能超越其他執行緒池的?為了效能,自定義資料結構 fastlist concurrentbag 主要就是concurrentbag使用threadlocal sharelist 等待queue 對獲取connnection做了優化。定時器相關的使用 schedul...

linux redis 資料庫 原始碼安裝

一 redis介紹 redis是remote dictionary server的縮寫。他本質上乙個key value資料庫,與memcached類似的nosql型資料庫,但是他的資料可以持久化的儲存在磁碟上,解決了服務重啟後資料不丟失的問題,他的值可以是string 字串 list 列表 sets...

原始碼編譯mariadb資料庫

開始安裝 步驟 環境配置 1.防火牆 2.selinux配置 3.mysql使用者 4.安裝開發工具 5.建立資料庫檔案,並使用者 組修改許可權 編譯過程 6.解壓包 7.編譯三步驟 8.給主程式包 basedir 修改使用者 組許可權 9.設定環境變數 10.生成資料庫檔案 11.設定配置檔案和啟...