ecmall模型分析 pestel分析模型

转载自:http://blog.189pt.com/841/
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];
}


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;

具体操作例子://物品表的操作:
$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
{
var $table = 'goods';
var $prikey = 'goods_id';
var $alias = 'g';//缩写
var $_name = 'goods';
var $temp; // 临时变量
var $_relation = array(
// 一个商品对应一条商品统计记录
'has_goodsstatistics' => array(
'model' => 'goodsstatistics',
'type' => HAS_ONE,
'foreign_key' => 'goods_id',
'dependent' => true
),
// 一个商品对应多个规格
'has_goodsspec' => array(
'model' => 'goodsspec',
'type' => HAS_MANY,
'foreign_key' => 'goods_id',
'dependent' => true
),
// 一个商品对应一个默认规格
'has_default_spec' => array(
'model' => 'goodsspec',
'type' => HAS_ONE,
'refer_key' => 'default_spec',
'foreign_key' => 'spec_id',
),
// 一个商品对应多个属性
'has_goodsattr' => array(
'model' => 'goodsattr',
'type' => HAS_MANY,
'foreign_key' => 'goods_id',
'dependent' => true
),
// 一个商品对应多个图片
'has_goodsimage' => array(
'model' => 'goodsimage',
'type' => HAS_MANY,
'foreign_key' => 'goods_id',
'dependent' => true
),
// 一个商品只能属于一个店铺
'belongs_to_store' => array(
'model' => 'store',
'type' => BELONGS_TO,
'foreign_key' => 'store_id',
'reverse' => 'has_goods',
),
// 商品和分类是多对多的关系
'belongs_to_gcategory' => array(
'model' => 'gcategory',
'type' => HAS_AND_BELONGS_TO_MANY,
'middle_table' => 'category_goods',
'foreign_key' => 'goods_id',
'reverse' => 'has_goods',
),
// 商品和会员是多对多的关系(会员收藏商品)
'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',
),
// 商品和推荐类型是多对多的关系 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',
),
);
}

这里贴出了实体goods模型类中的内容,先是表格的属性,再就是goods与其它实体之间的关联关系的定义。然后我们再看看这个函数,它是BaseModel构造函数里调用的方法,对对象中的基础变量进行初使化:

function BaseModel($params, $db)
{
$this->db =& $db;
ecmall模型分析 pestel分析模型
!$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;
}
}
}

大家已经看出$_relation 中间是此实体的关联信息,然后在BaseModel类中的一个函数:

function _getJoinString($relation_info)
{
switch ($relation_info['type'])
{
case HAS_ONE://
$model =& m($relation_info['model']);

$ext_limit = '';
$relation_info['ext_limit'] &&$ext_limit = ' AND ' .$this->_getExtLimit($relation_info['ext_limit']);

$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:

$model =& m($relation_info['model']);
$be_related =$model->getRelation($relation_info['reverse']);
if (emptyempty($be_related))
{

$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);

$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;
}
}

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表进行关联查找了。
到这里,读者就可以知道,如果在上面进行二次开发的话,怎样进行数据库操作就已经很 明确的了。
在BaseModel与cls_mysql(mysql.php)中,有很多的有关数据操作的函数,这里就不需要再一一进行解释了,而在cls_mysql中,有一些更基础的操作函数,还有仿真Adodb 的函数,可以直接跳过BaseModel中的函数
以上介绍了如何在 ecmall的平台上进行数据库操作,如果操作更加的复杂,这里还有一种更加直接的方法:

$sql = "select g.goods_id,g.goods_name, from ".DB_PREFIX."goodsg, ".DB_PREFIX."goods_spec gs , ".DB_PREFIX."store s wherecate_id='".$cate_id."' AND g.if_show = 1 AND g.closed = 0 andg.goods_id=gs.goods_id and g.store_id=s.store_id andgs.stock>0 and s.state=1 order by g.add_time desclimit 6";
$goods_mod =& m('goods');
$category_goods = $goods_mod->getAll($sql);
if(!$category_goods){
$category_goods=array();
}
return $category_goods;

就可以直接使用sql语句进行数据操作了。

还可以在BaseModel中定义自己的操作方法,其中可以使用$this->db->(cls_mysql中定义的方法)来调用cls_mysql中的函数,从而可以添加更加复杂的数据操作函数。

  

爱华网本文地址 » http://www.413yy.cn/a/25101013/166922.html

更多阅读

ecmall模型分析 pestel分析模型

转载自:http://blog.189pt.com/841/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[$mod

多元化战略基本模型分析 基本粒子标准模型

企业发展多元化战略(也叫多角化战略)中,基本的多元战略方向是水平一体化战略、垂直一体化战略、相关综合多元化战略和非相关混合多元化战略。在实际的企业战略咨询过程中,挨个地分析解释虽然也能讲清楚,但对于接受者总是有概念绕圈的感觉

波士顿矩阵模型及工商应用 波士顿矩阵分析模型

龙信数据研究中心数据研发部摘要:波士顿矩阵是战略管理重要的模型应用,是制定公司层战略最流行的方法之一。本文从工商角度对波士顿矩阵模型进行了研究,着重研究如何将波士顿矩阵模型应用于工商数据分析。研究表明,波士顿矩阵模型能够

竞争力分析模型 战略管理新工具——企业竞争力分析模型

     如何将企业的战略落实到可操作的具体措施上,是成长型企业面临的一个重要课题。相对于成熟公司,可采用平衡计分卡(BSC)等众所周知的战略管理工具,但是成长型企业由于基础数据缺乏、管理成熟度不足,实施成熟的战略管理工具存在一

声明:《ecmall模型分析 pestel分析模型》为网友微凉的夏日分享!如侵犯到您的合法权益请联系我们删除