對於資料庫關係模型的分析,我覺得需要從兩個函式說起:
//獲取乙個模型
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.設定配置檔案和啟...