2019独角兽企业重金招聘Python工程师标准>>>

所谓模型,则是一个一个的数据实体,换句话说就是一个数据表,你可以基于这个模

型,调用model.base.php中的数据库操作函数来对数据进行增、删、改、查的操作。

这里的业务模型,是在实体模型基础上,再继承一次,然后对一些方法进行重写。

系统中只有三个实体有业务模型:

推荐类型 recommend;商品数据模型 goods;商品分类业务模型 gcategory;

具体操作例子:

//物品表的操作:

$model_goods = & m(‘goods’);

$goods_info = $model_goods->get($goods_id); 这里需要解释一下对于数据模型的操作是怎样的一个函数调用过程:

首先:$model_goods = &m(‘goods’);

对于数据库关系模型的分析,我觉得需要从两个函数说起:

  1. //获取一个模型
  2. function &m($model_name, $params = array(), $is_new = false)
  3. {
  4. static $models = array();
  5. $model_hash = md5($model_name . var_export($params, true));
  6. if ($is_new || !isset($models[$model_hash]))
  7. {
  8. $model_file = ROOT_PATH . ‘/includes/models/’ . $model_name .
  9. ‘.model.php';
  10. if (!is_file($model_file))
  11. {
  12. /* 不存在该文件,则无法获取模型 */
  13. return false;
  14. }
  15. include_once($model_file);
  16. $model_name = ucfirst($model_name) . ‘Model';
  17. if ($is_new)
  18. {
  19. return new $model_name($params, db());
  20. }
  21. $models[$model_hash] = new $model_name($params, db());
  22. }
  23. return $models[$model_hash];
  24. }
  25. //获取一个业务模型
  26. function &bm($model_name, $params = array(), $is_new = false)
  27. {
  28. static $models = array();
  29. $model_hash = md5($model_name . var_export($params, true));
  30. if ($is_new || !isset($models[$model_hash]))
  31. {
  32. $model_file = ROOT_PATH . ‘/includes/models/’ . $model_name .
  33. ‘.model.php';
  34. if (!is_file($model_file))
  35. {
  36. /* 不存在该文件,则无法获取模型 */
  37. return false;
  38. }
  39. include_once($model_file);
  40. $model_name = ucfirst($model_name) . ‘BModel';
  41. if ($is_new)
  42. {
  43. return new $model_name($params, db());
  44. }
  45. $models[$model_hash] = new $model_name($params, db());
  46. }
  47. return $models[$model_hash];
  48. }

我们看一下&m()函数的代码,其中var_export()函数则是将传进来的实体,返回相应的实体类对象,因为所有的model都继承至model.base.php中的BaseModel类,这个类中定义了基本所有的操作函数,因此$model_goods对象可以对数据库进行相应的操作。

而我们再看看goods.model.php中的GoodsModel的代码:

  1. class GoodsModel extends BaseModel
  2. {
  3. var $table = ‘goods';
  4. var $prikey = ‘goods_id';
  5. var $alias = ‘g';//缩写
  6. var $_name = ‘goods';
  7. var $temp; // 临时变量
  8. var $_relation = array(
  9. // 一个商品对应一条商品统计记录
  10. ‘has_goodsstatistics’ => array(
  11. ‘model’ => ‘goodsstatistics’,
  12. ‘type’ => HAS_ONE,
  13. ‘foreign_key’ => ‘goods_id’,
  14. ‘dependent’ => true
  15. ),
  16. // 一个商品对应多个规格
  17. ‘has_goodsspec’ => array(
  18. ‘model’ => ‘goodsspec’,
  19. ‘type’ => HAS_MANY,
  20. ‘foreign_key’ => ‘goods_id’,
  21. ‘dependent’ => true
  22. ),
  23. // 一个商品对应一个默认规格
  24. ‘has_default_spec’ => array(
  25. ‘model’ => ‘goodsspec’,
  26. ‘type’ => HAS_ONE,
  27. ‘refer_key’ => ‘default_spec’,
  28. ‘foreign_key’ => ‘spec_id’,
  29. ),
  30. // 一个商品对应多个属性
  31. ‘has_goodsattr’ => array(
  32. ‘model’ => ‘goodsattr’,
  33. ‘type’ => HAS_MANY,
  34. ‘foreign_key’ => ‘goods_id’,
  35. ‘dependent’ => true
  36. ),
  37. // 一个商品对应多个图片
  38. ‘has_goodsimage’ => array(
  39. ‘model’ => ‘goodsimage’,
  40. ‘type’ => HAS_MANY,
  41. ‘foreign_key’ => ‘goods_id’,
  42. ‘dependent’ => true
  43. ),
  44. // 一个商品只能属于一个店铺
  45. ‘belongs_to_store’ => array(
  46. ‘model’ => ‘store’,
  47. ‘type’ => BELONGS_TO,
  48. ‘foreign_key’ => ‘store_id’,
  49. ‘reverse’ => ‘has_goods’,
  50. ),
  51. // 商品和分类是多对多的关系
  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’,
  58. ),
  59. // 商品和会员是多对多的关系(会员收藏商品)
  60. ‘be_collect’ => array(
  61. ‘model’ => ‘member’,
  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’,
  67. ),
  68. // 商品和推荐类型是多对多的关系 todo
  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’,
  75. ),
  76. );
  77. var $_autov = array(
  78. ‘goods_name’ => array(
  79. ‘required’ => true,
  80. ‘filter’ => ‘trim’,
  81. ),
  82. );
  83. }

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

  1. function BaseModel($params, $db)
  2. {
  3. $this->db =& $db;
  4. !$this->alias && $this->alias = $this->table;
  5. $this->_prefix = DB_PREFIX;
  6. $this->table = $this->_prefix . $this->table;
  7. if (!emptyempty($params))
  8. {
  9. foreach ($params as $key => $value)
  10. {
  11. $this->$key = $value;
  12. }
  13. }
  14. }

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

  1. function _getJoinString($relation_info)
  2. {
  3. switch ($relation_info['type'])
  4. {
  5. case HAS_ONE://
  6. $model =& m($relation_info['model']);
  7. /* 联合限制 */
  8. $ext_limit = ”;
  9. $relation_info['ext_limit'] && $ext_limit = ‘ AND ‘ . $this->_getExtLimit($relation_info['ext_limit']);
  10. /* 获取参考键,默认是本表主键(直接拥有),否则为间接拥有 */
  11. $refer_key = isset($relation_info['refer_key']) ? $relation_info['refer_key'] : $this->prikey;
  12. /* 本表参考键=外表外键 */
  13. return ” LEFT JOIN {$model->table} {$model->alias} ON {$this->alias}.{$refer_key}={$model->alias}.{$relation_info['foreign_key']}{$ext_limit}”;
  14. break;
  15. case BELONGS_TO:
  16. /* 属于关系与拥有是一个反向的关系 */
  17. $model =& m($relation_info['model']);
  18. $be_related = $model->getRelation($relation_info['reverse']);
  19. if (emptyempty($be_related))
  20. {
  21. /* 没有找到反向关系 */
  22. $this->_error(‘no_reverse_be_found’, $relation_info['model']);
  23. return ”;
  24. }
  25. $ext_limit = ”;
  26. !emptyempty($relation_info['ext_limit']) && $ext_limit = ‘ AND ‘ . $this->_getExtLimit($relation_info['ext_limit'], $this->alias);
  27. /* 获取参考键,默认是外表主键 */
  28. $refer_key = isset($be_related['refer_key']) ? $be_related['refer_key'] :$model->prikey ;
  29. /* 本表外键=外表参考键 */
  30. return ” LEFT JOIN {$model->table} {$model->alias} ON {$this->alias}.{$be_related['foreign_key']} = {$model->alias}.{$refer_key}{$ext_limit}”;
  31. break;
  32. case HAS_AND_BELONGS_TO_MANY:
  33. /* 连接中间表,本表主键=中间表外键 */
  34. $malias = isset($relation_info['alias']) ? $relation_info['alias'] : $relation_info['middle_table'];
  35. $ext_limit = ”;
  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}”;
  38. break;
  39. }
  40. }
  41. /* 模型相关常量定义 */
  42. define(‘HAS_ONE’, 1); //一对一关联
  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语句,就可以针对实体的关联实体进行相应的关联操作了。

  1. //物品表的操作:
  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’
  7. )); 这里的’join’ => ‘blongs_to_store’ ,我们从上面的:
  8. // 一个商品只能属于一个店铺
  9. ‘belongs_to_store’ => array(
  10. ‘model’ => ‘store’,
  11. ‘type’ => BELONGS_TO,
  12. ‘foreign_key’ => ‘store_id’,
  13. ‘reverse’ => ‘has_goods’,
  14. ),

这里我们可以知道这是在与store表进行关联查找了。ECmall二次开发

到这里,读者就可以知道,如果在上面进行二次开发的话,怎样进行数据库操作就已经很明确的了。

在BaseModel与cls_mysql(mysql.php)中,有很多的有关数据操作的函数,这里就不需要再一一进行解释了,而在cls_mysql中,有一些更基础的操作函数,还有仿真 Adodb 的函数,可以直接跳过BaseModel中的函数

以上介绍了如何在ecmall的平台上进行数据库操作,如果操作更加的复杂,这里还有一种更加直接的方法:

  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);
  4. if(!$category_goods){
  5. $category_goods=array();
  6. }
  7. return $category_goods;

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

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

转载于:https://my.oschina.net/winnsay/blog/633499

ECMALL数据库关系模型的实现相关推荐

  1. 第2章 数据库关系模型---数据库原理及应用

    目录 第2章        数据库关系模型 本章要求: 1.关系模型的基本概念 关系数据模型-现有主流DBMS支持的逻辑模型 域(Domain):相同数据类型的集合 关系模式:关系名和属性 关系实例: ...

  2. 思辨领域模型-- DDD≠数据库关系模型

    Eric Evans的<领域驱动设计>问世已经14年之久,到今天几乎所有业务团队都或多或少有涉及DDD.然而如果较真会发现,认真遵循DDD设计原则的团队仍是少数,在多数团队的现都是:**领 ...

  3. 【MySQL】使用Visio绘制数据库关系模型图

    使用Visio绘制数据库关系模型图 1 新建项目 文件-新建–软件和数据库-数据库模型图 点击后,出现如下界面: 2 绘制 左侧"实体关系"中将"实体"形状拖放 ...

  4. 数据库关系模型与关系运算---2022.2.13

    关于外模式,模式,内模式的理解 可以看到用不同的语句进行表示: 关系的性质 概念模式/内模式映射是物理独立性的关键: 外模式/概念模式映射就是逻辑独立性的关键 候选键 (最小组成的超键) 关系中的一个 ...

  5. 数据库关系模型的三类完整性约束

    关系模型中有三类完整性约束,分别是:实体完整性,参照完整性,用户定义完整性 实体完整性 定义:实体完整性是用于保证关系数据库中每个元组都是可区分的,唯一的. 它的意思就是说数据表中每一行都应该有办法将 ...

  6. 数据库 ---- 关系模型

    在关系模型中,操作的对象和结果都是二维表,关系模型是目前最流行的数据库模型.支持关系模型的数据库管理系统称为关系数据库管理系统,Access就是一种关系数据库管理系统. 1.基本术语 (1)关系(Re ...

  7. 数据库关系模型和关系运算[姊妹篇.第三弹]

    随着ORM框架的日益流行,如今的码农们直接操作数据库语法的越来越少了,一顿orm语法操作猛如虎,一遇问题问题便靓仔语塞.这种情况不在少数,就如我的工作中,我所知道的同事和实习生当中,就有不少人非常喜欢 ...

  8. 数据库关系模型有哪三类完整性约束?

    一.实体完整性 实体完整性要求每个表都有唯一标识符,每一个表中的主键字段不能为空或者重复的值. 二.参照完整性 参照完整性要求关系中不允许引用不存在的实体.设定相应的更新删除插入规则来更新参考表. 例 ...

  9. 数据库关系模型不合理会带来什么问题?

    不合理的数据库模式设计,一方面会造成大量的数据冗余存在:而且对模式进行操作会引起操作异常. 主要包括:插入异常.删除异常和更新删除三类 引起以上问题的原因在于:关系模式的属性间存在各种依赖关系,因此, ...

最新文章

  1. 计算机视觉模型效果不佳,你可能是被相机的Exif信息坑了
  2. 2022速卖通328大促活动招商规则出炉啦,热销高潜产品抢先看
  3. 处理文件和文件夹的模块---os
  4. C++11-long long
  5. oracle数据库表空间文件收缩实例
  6. Ball Dropping
  7. HTTP协议中返回代码302的情况
  8. java 泛型 子类_Java泛型:要求泛型成为某种类型的子类
  9. 凯辉基金与法投行完成对资管软件公司NeoXam的投资 加速企业国际化发展布局
  10. git撤销单个文件的修改_程序员都要掌握的 Git 使用技巧【实践】
  11. Mysql 数据库迁移
  12. 24、将Div中的所有元素保存为图片 Html2Canvas
  13. 移动APP测试经验总结
  14. android EditText 设置弹出数字输入法键盘
  15. 目标检测算法的大体框架-------backbone、head、neck
  16. 近地天体撞击地球原理的设想
  17. 目标检测——梯度均衡机制GHM(Gradient Harmonized Mechanism)的理解
  18. ceph修复osd为down的情况
  19. 微信小程序注册使用教程
  20. 动力环境监控是什么?动力环境监控系统包括哪些设备

热门文章

  1. 常见荧光定量 PCR 检测方法比较
  2. 除了盖泡面,kindle还可以帮你提高科研效率
  3. mysql 导出用户权限_MySQL中导出用户权限设置的脚本分享
  4. printf输出字符串_C语言入门必学第一课,学习“输入与输出”!
  5. 树莓派实现AD转换(pcf8591模块)
  6. php mvc cms企业站,Phpcms V9程序目录结构及MVC简析
  7. 无法执行添加/移除操作,因为代码元素**是只读的
  8. 乒乓球比赛赛程_国乒今年最后一站比赛延期!赛程缩短比赛地温暖,教练组考察队员...
  9. 趣学python3(21)-pygame-surface位置及角色移动
  10. 【深度学习】解决物体检测中的小目标问题