# 数据对象

# 定位

  • 路径 : core/model/

  • 文件名称: DataObject.php

  • github路径: https://github.com/skygreen2001/betterlife/blob/master/core/model/DataObject.php

  • 每个数据对象都继承它,可以使用数据对象通用方法里说明的方法直接执行数据库的操作

# 概述

  • 数据库里的每张表对应一个数据对象
  • 表名定义规则:库名缩写+“”+目录名+""+类名[头字母小写]
    • 如博客表名定义为 : bb_core_blog
    • 那么博客数据对象即: Blog[头字母大写]

# 数据模型层

  • 数据对象类定义都放置在前台, 如示例就放置在根路径[home/betterlife/src/domain]路径下, 数据模型层详细描述可参考Model定义说明。

  • 以下示例中提到的Blog、Comment、Role、Userdetail和User等类的定义都放置在该路径下的文件里;如Blog.php放置在:[home/betterlife/src/domain/core/Blog.php]。

# 基本定义

数据对象的属性定义包括以下两种方式:

  1. 所有的列定义的对象属性都是private, 同时定义setter和getter方法。包括属性和属性的set和get方法定义。
- 这是现在Java实体类定义的主流方式, 在框架开发之处, 实体类采用这种定义方式, 现在作为默认保留数据对象的方式。
  1. 所有的列定义的对象属性都是public。
- 现在框架里数据对象都采用这种方式,它被证明在php里更为通用使用,已被框架默认为系统使用的方式;例如代码一键生成中生成的数据对象实体类定义就采用这种方式。

# 关系定义

相对于数据库定义表关系定义,数据对象的关系定义如下:

  • 一对一[has_one]

    • 例如示例项目中
      • 主数据对象:User
      • 从数据对象:Userdetail
      • 用户[主数据对象]和用户详情[从数据对象]就是一对一关系
  • 一对多[has_many]

    • 例如示例项目中
      • 主数据对象:Blog
      • 从数据对象:Comment
      • 博客[主数据对象]和评论[从数据对象]就是一对多关系
  • 多对多[many_many]

    • 例如示例项目中
      • 主数据对象:User
      • 从数据对象:Role
      • 多对多关系数据对象:Userrole
      • 用户[主数据对象]和角色[从数据对象]就是多对多关系

并根据实际开发需要定义了附属的关系形态:

  • 从属于一对一[belong_has_one]

    • 即从表中一字段关联主表中的主键

    • 例如示例项目中

      • 主数据对象:User
      • 从数据对象:Userdetail
      • 用户详情[从数据对象]和用户[主数据对象]就是从属于一对一关系
      • 在从表中存在字段user_id关联主表中的主键
  • 从属于多对多[belongs_many_many]

    • 例如示例项目中
      • 主数据对象:User
      • 从数据对象:Role
      • 多对多关系数据对象:Userrole
      • 角色[从数据对象]和用户[主数据对象]就是从属于多对多关系
  • 多对多分解成一对多

    • 在将关系型数据库的表转换成面向对象的类进行代码的开发处理之后,作为开发者,我们往往发现,多对多都会分解为一对多来进行处理。

    • 例如示例项目中

      • 主数据对象:User
      • 从数据对象:Role
      • 多对多关系数据对象:Userrole
      • 用户[主数据对象]和角色[从数据对象]就是多对多关系
    • 在这里:

      • 用户[主数据对象]和多对多关系数据对象的关系是一对多的关系

      • 角色[从数据对象]和多对多关系数据对象的关系是一对多的关系

      • 也就是说通过一个用户可以找到多个角色, 通过一个角色可以找到多个用户

      • 在实际的开发中,多对多关系往往更多的是使用这种一对多的方式进行处理。

  • 对数据对象的关系定义可参考数据对象规格说明;
  • 对数据对象的关系定义变量参见类: DataObjectSpec, 对数据对象的关系定义实现参见类: DataObjectRelation。

# 高级定义

  • 所有数据实体类如POJO的父类
  • 该实体类设计为ActiveRecord模式。
  • 可直接在对象上操作CRUD增删改查操作
  • 查主要为: 根据主键和名称查找对象、总记录数和分页查找等常规方法。

更多高级定义情参考数据对象规格说明