ECMALL数据库关系模型的实现
2019独角兽企业重金招聘Python工程师标准>>>
所谓模型,则是一个一个的数据实体,换句话说就是一个数据表,你可以基于这个模
型,调用model.base.php中的数据库操作函数来对数据进行增、删、改、查的操作。
这里的业务模型,是在实体模型基础上,再继承一次,然后对一些方法进行重写。
系统中只有三个实体有业务模型:
推荐类型 recommend;商品数据模型 goods;商品分类业务模型 gcategory;
具体操作例子:
//物品表的操作:
$model_goods = & m(‘goods’);
$goods_info = $model_goods->get($goods_id); 这里需要解释一下对于数据模型的操作是怎样的一个函数调用过程:
首先:$model_goods = &m(‘goods’);
对于数据库关系模型的分析,我觉得需要从两个函数说起:
- //获取一个模型
- 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];
- }
我们看一下&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;
- !$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表进行关联查找了。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){
- $category_goods=array();
- }
- return $category_goods;
就可以直接使用sql语句进行数据操作了。
还可以在BaseModel中定义自己的操作方法,其中可以使用$this->db->(cls_mysql中定义的方法) 来调用cls_mysql中的函数,从而可以添加更加复杂的数据操作函数。
转载于:https://my.oschina.net/winnsay/blog/633499
ECMALL数据库关系模型的实现相关推荐
- 第2章 数据库关系模型---数据库原理及应用
目录 第2章 数据库关系模型 本章要求: 1.关系模型的基本概念 关系数据模型-现有主流DBMS支持的逻辑模型 域(Domain):相同数据类型的集合 关系模式:关系名和属性 关系实例: ...
- 思辨领域模型-- DDD≠数据库关系模型
Eric Evans的<领域驱动设计>问世已经14年之久,到今天几乎所有业务团队都或多或少有涉及DDD.然而如果较真会发现,认真遵循DDD设计原则的团队仍是少数,在多数团队的现都是:**领 ...
- 【MySQL】使用Visio绘制数据库关系模型图
使用Visio绘制数据库关系模型图 1 新建项目 文件-新建–软件和数据库-数据库模型图 点击后,出现如下界面: 2 绘制 左侧"实体关系"中将"实体"形状拖放 ...
- 数据库关系模型与关系运算---2022.2.13
关于外模式,模式,内模式的理解 可以看到用不同的语句进行表示: 关系的性质 概念模式/内模式映射是物理独立性的关键: 外模式/概念模式映射就是逻辑独立性的关键 候选键 (最小组成的超键) 关系中的一个 ...
- 数据库关系模型的三类完整性约束
关系模型中有三类完整性约束,分别是:实体完整性,参照完整性,用户定义完整性 实体完整性 定义:实体完整性是用于保证关系数据库中每个元组都是可区分的,唯一的. 它的意思就是说数据表中每一行都应该有办法将 ...
- 数据库 ---- 关系模型
在关系模型中,操作的对象和结果都是二维表,关系模型是目前最流行的数据库模型.支持关系模型的数据库管理系统称为关系数据库管理系统,Access就是一种关系数据库管理系统. 1.基本术语 (1)关系(Re ...
- 数据库关系模型和关系运算[姊妹篇.第三弹]
随着ORM框架的日益流行,如今的码农们直接操作数据库语法的越来越少了,一顿orm语法操作猛如虎,一遇问题问题便靓仔语塞.这种情况不在少数,就如我的工作中,我所知道的同事和实习生当中,就有不少人非常喜欢 ...
- 数据库关系模型有哪三类完整性约束?
一.实体完整性 实体完整性要求每个表都有唯一标识符,每一个表中的主键字段不能为空或者重复的值. 二.参照完整性 参照完整性要求关系中不允许引用不存在的实体.设定相应的更新删除插入规则来更新参考表. 例 ...
- 数据库关系模型不合理会带来什么问题?
不合理的数据库模式设计,一方面会造成大量的数据冗余存在:而且对模式进行操作会引起操作异常. 主要包括:插入异常.删除异常和更新删除三类 引起以上问题的原因在于:关系模式的属性间存在各种依赖关系,因此, ...
最新文章
- 计算机视觉模型效果不佳,你可能是被相机的Exif信息坑了
- 2022速卖通328大促活动招商规则出炉啦,热销高潜产品抢先看
- 处理文件和文件夹的模块---os
- C++11-long long
- oracle数据库表空间文件收缩实例
- Ball Dropping
- HTTP协议中返回代码302的情况
- java 泛型 子类_Java泛型:要求泛型成为某种类型的子类
- 凯辉基金与法投行完成对资管软件公司NeoXam的投资 加速企业国际化发展布局
- git撤销单个文件的修改_程序员都要掌握的 Git 使用技巧【实践】
- Mysql 数据库迁移
- 24、将Div中的所有元素保存为图片 Html2Canvas
- 移动APP测试经验总结
- android EditText 设置弹出数字输入法键盘
- 目标检测算法的大体框架-------backbone、head、neck
- 近地天体撞击地球原理的设想
- 目标检测——梯度均衡机制GHM(Gradient Harmonized Mechanism)的理解
- ceph修复osd为down的情况
- 微信小程序注册使用教程
- 动力环境监控是什么?动力环境监控系统包括哪些设备
热门文章
- 常见荧光定量 PCR 检测方法比较
- 除了盖泡面,kindle还可以帮你提高科研效率
- mysql 导出用户权限_MySQL中导出用户权限设置的脚本分享
- printf输出字符串_C语言入门必学第一课,学习“输入与输出”!
- 树莓派实现AD转换(pcf8591模块)
- php mvc cms企业站,Phpcms V9程序目录结构及MVC简析
- 无法执行添加/移除操作,因为代码元素**是只读的
- 乒乓球比赛赛程_国乒今年最后一站比赛延期!赛程缩短比赛地温暖,教练组考察队员...
- 趣学python3(21)-pygame-surface位置及角色移动
- 【深度学习】解决物体检测中的小目标问题