Model配置


在HerosPHP中,Model和数据表是一一对应的,也就是说一个数据表必须对应一个Model, 在后期可能会支持组合Model, 就是这个Model本身不对应任何数据表,它是其他Model的组合。比如说有个用户模型可能是由用户基本信息模型UserBasicModel 和用户扩展信息模型UserInfoModel组合而成。在比如后期我们会加上ElasticSearchModel, 那凡是继承ElasticSearchModel都会自动化支持elasticsearch搜索。下面我们看看Model怎么配置:

namespace app\models;

use herosphp\filter\Filter;
use herosphp\model\C_Model;

class UserModel extends C_Model {

    public function __construct() {

        //创建model对象并初始化数据表名称
        parent::__construct('user');

        //设置表数据表主键,默认为id
        $this->setPrimaryKey('id');

        $filterMap = array(
            'name' => array(Filter::DFILTER_STRING, array(6, 12), Filter::DFILTER_SANITIZE_TRIM,
                array("require" => "名字不能为空.", "length" => "名字长度必需在6-12之间.")),
            'email' => array(Filter::DFILTER_EMAIL, NULL, NULL,
                array("type" => "请输入正确的邮箱地址.")),
            'mobile' => array(Filter::DFILTER_MOBILE, NULL, NULL,
                array("type" => "请输入正确的手机号码.")),
            'id_number' => array(Filter::DFILTER_IDENTIRY, NULL, NULL,
                array('type' => '请输入正确的身份证号码.')),
            'content' => array(Filter::DFILTER_STRING, NULL, Filter::DFILTER_MAGIC_QUOTES|Filter::DFILTER_SANITIZE_HTML,
                array("require" => "个人简介不能为空."))
        );

        $this->setFilterMap($filterMap);

        //设置数据表字段别名映射
        $maping = array(
            'add_time' => 'addTime',
            'last_login_time' => 'lltime'
        );
        $this->setMapping($maping);

        //设置数据表水平分割策略
        $this->setTableMapping(array('user_0', 'user_1','user_2', 'user_3'));
    }
} 

我们在框架中提供了2个基本模型, C_ModelMongoModel, 目前来说所有的模型都必须继承这个两个模型中的一个,其中MongoModel是在3.0.0之后才新增的。那为什么说“目前”,那是因为我们刚刚说了后期会陆续添加ElasticSearchModel和其他模型的。

C_Model模型配置

  • 创建一个新的Model需要重写构造方法,在构造方法中需要初始化该模型对应的数据表名称,需要的注意的是这个数据表名称是不包含前缀的,因为我们在数据库配置的时候已经配置了数据表前缀,在C_Model中会自动加上的。

  • 接下来我们还需要设置数据表的主键,默认是"id", 如果你的数据表没有主键的话,那请加上,因为一个好数据库设计的一条就是"每个表必须包含主键"。如果没有主键那再后期查询的时候也会有很多麻烦的,这个我们后面在讲数据查询的时候还会讲到的。

  • 第三个你要设置的就是强大的数据验证过滤器了,当然这个配置是可选的,你也可以不配置,那就没有数据自动验证和过滤功能了。关于数据验证和过滤的使用方法,请戳这里数据验证和过滤

数据库字段别名映射配置很简单,就是一个Key => Value数组,key表示字段名,value表示别名。这个主要是用来查询是转换输出的。

$maping = array(
    'add_time' => 'addTime',
    'last_login_time' => 'lltime'
);
$this->setMapping($maping);

使用场景

C_Model 模型是最常使用的模型,一般情况下你只需要使用这个模型就好了。

MongoModel mongodb数据模型

如果你使用mongodb作为数据库,你可以使用MongoModel, 使用方法很简单,直接继承MongoModel就可以了。 在使用过程中增删查改的接口几乎都是一样的,没有什么区别,这也是我们为什么统一查询API的原因了,可以让你在各个数据模型之间无缝切换。

SimpleShardingModel 简单分片模型

此模型为简单分片模型,不能作为主数据表的模型,只能作为扩展表的模型,必须依赖主表,不能独立操作。

该模型不支持一些批量操作方法,比如 updates(), deletes() 方法和 getItems() 等方法,所以该模型不支持单独查询列表。

由于该模型需用用主键ID作为数据表路由,所以使用此模型不能依赖数据库生成的自增ID,需要手动生成分布式唯一ID. 框架中提供了 StringUtils::genGlobalUid($forceUnique=true, $bit=24) 方法来生成分布式唯一ID。

使用场景

如果将数据表进行垂直分割之后,发现主表很小,主表都是存储一些整数,短字符,以及时间戳之类的数据,一条数据不到0.1kb, 但是扩展表却占据比较大空间,一条数据几十kb甚至上百kb(比如文章或者博客就是这样的数据模型), 这个时候你就可以把扩展表建成分片模型,分成N个表来存储,这样查询速度会块很多。 使用方法很简单,你只需继承这个 SimpleShardingModel 就可以。然后为其指定分片数量,一般为质数,这样数据散列的更均匀一些。

注意: 如果在使用的过程中需要临时增加分片的话,需要写脚本把数据进行转移,重新散列到新的分片中。

namespace models;

use herosphp\model\SimpleShardingModel;

class UserInfoModel extends SimpleShardingModel {

    public function __construct() {

        //创建model对象并初始化数据表名称
        parent::__construct('user_info');

        //设置表数据表主键,默认为id
        $this->setPrimaryKey('id');

        //分片数量
        $this->shardingNum = 7;

    }
} 

ShardingRouterModel 基于路由分片的模型

该分片数据模型实现,适用于主表数据的关联数据,比如文章评论,用户图片等, 一般使用主表数据的ID作为分片路由。

一般都需要有分片路由的(如userid, aid等)如果没有分片路由,则在查询数据列表(getItems()方法)的时候,会出现数据误差

使用场景

比如开发文章系统的时候,如果文章数据量比较大,那么文章评论数量将是惊人的,这个时候你就可以把评论表建成路由分片模型 ShardingRouterModel, 使用文章ID作为分片路由,每次对模型操作之前必须先设置分片路由。

$aid = $request->getParameter('aid');
$model = Loader::model('articleComments');
$model->setShardingRouter($aid);

$data = array('title' => '测试评论', 'addtime' => time());
$model->add($data);

$list = $model->getItems();
Copyright © HerosPHP 2016 all right reserved,powered by Gitbook最后更新时间: 2016-10-16 11:35:17

results matching ""

    No results matching ""