/**
* 获取一个模型
*
* @author Garbin
* @param string $model_name
* @param array $params
* @param book $is_new
* @return object
*/
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];
}
/**
* 获取一个业务模型
*
* @param string $model_name
* @param array $params
* @param bool $is_new
* @return object
*/
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;
具体操作例子:
2
$model_goods
= & m(
'goods'
);
3
$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的代码:
1
class
GoodsModel
extends
BaseModel
4
var
$prikey
=
'goods_id'
;
8
var
$_relation
=
array
(
10
'has_goodsstatistics'
=>
array
(
11
'model'
=>
'goodsstatistics'
,
13
'foreign_key'
=>
'goods_id'
,
17
'has_goodsspec'
=>
array
(
18
'model'
=>
'goodsspec'
,
20
'foreign_key'
=>
'goods_id'
,
24
'has_default_spec'
=>
array
(
25
'model'
=>
'goodsspec'
,
27
'refer_key'
=>
'default_spec'
,
28
'foreign_key'
=>
'spec_id'
,
31
'has_goodsattr'
=>
array
(
32
'model'
=>
'goodsattr'
,
34
'foreign_key'
=>
'goods_id'
,
38
'has_goodsimage'
=>
array
(
39
'model'
=>
'goodsimage'
,
41
'foreign_key'
=>
'goods_id'
,
45
'belongs_to_store'
=>
array
(
48
'foreign_key'
=>
'store_id'
,
49
'reverse'
=>
'has_goods'
,
52
'belongs_to_gcategory'
=>
array
(
53
'model'
=>
'gcategory'
,
54
'type'
=> HAS_AND_BELONGS_TO_MANY,
55
'middle_table'
=>
'category_goods'
,
56
'foreign_key'
=>
'goods_id'
,
57
'reverse'
=>
'has_goods'
,
60
'be_collect'
=>
array
(
62
'type'
=> HAS_AND_BELONGS_TO_MANY,
63
'middle_table'
=>
'collect'
,
64
'foreign_key'
=>
'item_id'
,
65
'ext_limit'
=>
array
(
'type'
=>
'goods'
),
66
'reverse'
=>
'collect_goods'
,
69
'be_recommend'
=>
array
(
70
'model'
=>
'recommend'
,
71
'type'
=> HAS_AND_BELONGS_TO_MANY,
72
'middle_table'
=>
'recommended_goods'
,
73
'foreign_key'
=>
'goods_id'
,
74
'reverse'
=>
'recommend_goods'
,
78
'goods_name'
=>
array
(
这里贴出了实体goods模型类中的内容,先是表格的属性,再就是goods与其它实体之间的关联关系的定义。然后我们再看看这个函数,它是 BaseModel构造函数里调用的方法,对对象中的基础变量进行初使化:
1
function
BaseModel(
$params
,
$db
)
4
!
$this
->alias &&
$this
->alias =
$this
->table;
5
$this
->_prefix = DB_PREFIX;
6
$this
->table =
$this
->_prefix .
$this
->table;
7
if
(!emptyempty(
$params
))
9
foreach
(
$params
as
$key
=>
$value
)
大家已经看出$_relation 中间是此实体的关联信息,然后在BaseModel类中的一个函数:
1
function
_getJoinString(
$relation_info
)
3
switch
(
$relation_info
[
'type'
])
6
$model
=& m(
$relation_info
[
'model'
]);
9
$relation_info
[
'ext_limit'
] &&
$ext_limit
=
' AND '
.
$this
->_getExtLimit(
$relation_info
[
'ext_limit'
]);
11
$refer_key
= isset(
$relation_info
[
'refer_key'
]) ?
$relation_info
[
'refer_key'
] :
$this
->prikey;
13
return
" LEFT JOIN {$model->table} {$model->alias} ON {$this->alias}.{$refer_key}={$model->alias}.{$relation_info['foreign_key']}{$ext_limit}"
;
17
$model
=& m(
$relation_info
[
'model'
]);
18
$be_related
=
$model
->getRelation(
$relation_info
[
'reverse'
]);
19
if
(emptyempty(
$be_related
))
22
$this
->_error(
'no_reverse_be_found'
,
$relation_info
[
'model'
]);
26
!emptyempty(
$relation_info
[
'ext_limit'
]) &&
$ext_limit
=
' AND '
.
$this
->_getExtLimit(
$relation_info
[
'ext_limit'
],
$this
->alias);
28
$refer_key
= isset(
$be_related
[
'refer_key'
]) ?
$be_related
[
'refer_key'
] :
$model
->prikey ;
30
return
" LEFT JOIN {$model->table} {$model->alias} ON {$this->alias}.{$be_related['foreign_key']} = {$model->alias}.{$refer_key}{$ext_limit}"
;
32
case
HAS_AND_BELONGS_TO_MANY:
34
$malias
= isset(
$relation_info
[
'alias'
]) ?
$relation_info
[
'alias'
] :
$relation_info
[
'middle_table'
];
36
$relation_info
[
'ext_limit'
] &&
$ext_limit
=
' AND '
.
$this
->_getExtLimit(
$relation_info
[
'ext_limit'
],
$malias
);
37
return
" LEFT JOIN {$this->_prefix}{$relation_info['middle_table']} {$malias} ON {$this->alias}.{$this->prikey} = {$malias}.{$relation_info['foreign_key']}{$ext_limit}"
;
43
define(
'BELONGS_TO'
, 2);
44
define(
'HAS_MANY'
, 3);
45
define(
'HAS_AND_BELONGS_TO_MANY'
, 4);
46
define(
'DROP_CONDITION_TRUNCATE'
,
'TRUNCATE'
);
从这个函数中,我们可以看到,对于不同的关联关系,它会返回不同的关联时的查询语句片断,然后连接上主sql语句,就可以针对实体的关联实体进行相 应的关联操作了。
2
$model_goods
= & m(
'goods'
);
3
$goods_info
=
$model_goods
->find(
array
(
4
'conditions'
=>
"if_show=1 and closed=0"
,
5
'fields'
=>
'goods_id,goods_name,s.store_id,s.store_name'
,
6
'join'
=>
'blongs_to_store'
这里的’join’ => ‘blongs_to_store’ ,我们从上面的:
Php代码
2
'belongs_to_store'
=>
array
(
5
'foreign_key'
=>
'store_id'
,
6
'reverse'
=>
'has_goods'
,
这里我们可以知道这是在与store表进行关联查找了。 到这里,读者就可以知道,如果在上面进行二次开发的话,怎样进行数据库操作就已经很 明确的了。 在BaseModel与cls_mysql(mysql.php)中,有很多的有关数据操作的函数,这里就不需要再一一进行解释了,而 在cls_mysql中,有一些更基础的操作函数,还有仿真 Adodb 的函数,可以直接跳过BaseModel中的函数 以上介绍了如何在 ecmall的平台上进行数据库操作,如果操作更加的复杂,这里还有一种更加直接的方法:
Php代码
1
$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"
;
2
$goods_mod
=& m(
'goods'
);
3
$category_goods
=
$goods_mod
->getAll(
$sql
);
5
$category_goods
=
array
();
7
return
$category_goods
;
就可以直接使用sql语句进行数据操作了。
还可以在BaseModel中定义自己的操作方法,其中可以使用$this->db->(cls_mysql中定义的方法) 来调用cls_mysql中的函数,从而可以添加更加复杂的数据操作函数。