對於
資料庫關係模型的分析,我覺得需要從兩個函式說起:
//獲取乙個模型
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)}}
複製**
大家已經看出$_relation 中間是此實體的關聯
資訊,然後在basemodel類中的乙個函式:
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中的函式,從而可以新增更加複雜的資料操作函式。
資料庫模型 關係模型
關聯式資料庫採用關係模型作為資料的組織方式 1970年美國ibm公司研究室的研究員e.f.codd首次提出了資料庫系統的關係模型 計算機廠商推出的資料庫管理系統幾乎都支援關係模型 在使用者觀點下,關係模型中資料的邏輯結構是一張二維表 關係必須是規範化的,滿足一定的規範條件 最基本的規範條件 關係的每...
資料庫 關係模型與關聯式資料庫
superkey 乙個或多個屬性的集合,用來在關係中唯一地標識乙個元組 candidate key superkey如果任意真子集都不能成為superkey primary key db設計者選擇的candidate key foreigh key 乙個關係模式在它的屬性中包含另乙個關係模式的主碼 ...
資料庫 關係模型概念
超鍵 可唯一標識元組的屬性或屬性集 可有多餘屬性 候選鍵 把超鍵中的多餘屬性丟棄 主鍵 使用者最終選擇的唯一標識 外來鍵 其他模式的主鍵在本模式中存在 屬性值 資料項 是不可分解的最小單位 無重複元組無序性 屬性無序性 實體完整性 即主鍵不可能為空空值,否則失去唯一性 參照完整性 k是r1主鍵,r2...