模版定义:
    模型类的命名规则是:去除前缀的数据库表的名称+Model.class.php;
    如果模型类名称与数据库表名不同,需要设置该模型数据库表名称属性:
        tableName:不包含前缀的表明称。默认情况下与模型名相同,只有当前模型类名与所需要的表名不对应时才设置;
        trueTableName:包含前缀的数据库表名。该名称不需要设置,只有当上面的规则不适用或特殊情况下才需要设置;
        dbName:定义模型当前对应的数据库名。只有当前模型类对应的数据库与配置文件中的不同时才需要设置;
模型实例化:
    实例化基础模型(没有定义任何模型):
        $mdo=new Model(TableName);
        $mdo=M(TableName);
    实例化其他公共模型类:
        $mdo=new CommonModel(ModelName[,TB_PreFix][,DB_Config]);
        $mdo=M(CommonModel:ModelName[,DT_PreFix][,DB_Config]);
        对于DT_PreFix和DB_Config默认情况下为项目配置信息中表前缀和数据库连接信息;
    实例化用户自定义模型:
        $mdo=new UsrModel();
        $mdo=D(UsrModel);
        D()将自动检测模型类,如果存在自定义模型类,则实例化自定义模型类,否者实例化Model基类。对于已实例化过的模型不会重复实例化;
        D()的跨项目和分组调用:
        D([App://][Group/]ModelName);
    实例化空模型:
        $mdo=new Model();
        $mdo=M();
        空模型对象只是原生SQL操作,也支持跨项目调用;
字段定义:
    字段缓存目录:APP/Runtime/Data/_fields/下。每个模型对应一个字段缓存文件,其命名格式为:DB_Name.ModelName.php;
    获取当前数据表中字段信息:$mdo->getDbFields();
    如果不希望一来字段缓存或想提高性能,可以在模型类中手动定义数据表字段的名称以避免IO加载的效率开销。格式如下:
        protected $fields=array(
            'id',......,'_pk'='id','_autoinc'=>true
        );
        _pk用于设置主键,_autoinc设置是否自动增长;
数据主键:
    ThinkPHP默认约定每个数据表的主键都为id,且为自动增长类型。系统会自动识别当前操作表的字段信息和主键名,所以即使主键不是id,也无需额外配置;
    外部获取当前数据表主键名:$mdo->getPK();
属性访问:
    ThinkPHP模型对象实例本身也是一个数据对象,支持对象的属性和数组的引用两种方式获取或设置属性;
    对象属性方式:
        $mdo->find(1);//查询数据以产生数据对象。也可通过create()实现:$mdo_>create();
        $mdo->name;//获取name属性的值;
        $mdo->name='Name';//设置name属性的值;
    数组引用方式:
        $ary=$mdo->find(1);
        $ary['name'];//获取name属性的值;
        $ary['name']='Name';//设置name属性的值;
跨库操作:
    只需在模板类中设置所在的数据库名即可:
        protected $dbName=DB_Name;
    如果跨库中的表前缀与配置文件中的不同,须显示设置相应的前缀:
        protected $tablePrefix=PreFix;
    如果没有定义模型类,M()也支持跨库操作:
        $mdo=M(DB_Name.TB_Name,PreFix);
连接数据库:
    ThinkPHP支持两种方式连接数据库:配置文件和模型类connection属性;
    配置文件:位于App/Conf/config.php,分为两种配置方式:数组式和DSN式;
        数组式配置:
        return array(
            'DB_TYPE'=>'mysql',
            'DB_HOST=>'localhost',
            'DB_NAME'=>DB_Name,
            'DB_USER'=>DB_User,
            'DB_PWD'=>DB_Pwd,
            'DB_PORT'=>'3306',
            'DB_PREFIX'=>Prefix
            ...........//其它配置
        );
        DSN式配置:
        'DB_DSN'=>'DB_TYPE://DB_USER:DB_PWD@DB_HOST:DB_PORT/DB_Name';
        对于配置文件中同时存在DSN和数组格式的配置时,DSN参数优先;
        分布式数据库暂不支持DB_DSN配置;
        如果采用PDO驱动,必须首先配置DB_TYPE为pdo,然后单独配置其他参数。如:
            DB_TYPE=>pdo,
            DB_PREFIX=>fix,
            DB_USER=>usr,
            DB_PWD=>pwd,
            DB_DSN=>DB_TYPE:HOST;DB_NAME;CHARSET
        PDO方式的DB_DSN配置格式有所区别,根据不同的数据库类型设置有所不同;
    模型中的connection属性:
        如果在某个模型类里面定义了connection属性的话,则实例化该自定义模型的时候会采用定义的数据库连接信息,而不是配置文件中设置的默认连接信息;
        connection属性支持数组格式的配置,也支持DB_DSN格式配置。还可为其赋值为配置文件中的连接信息变量;
    使用M方法动态连接不同数据库:
        M(TB_NAME,FIX,CONNECTION):其中CONNECTION可以是数组或DB_DSN配置;
切换数据库:
    $this->db(DB_ID,CONNECTION):
        DB_ID为数字格式。对于已经调用过的数据库连接,是不需要再传入数据库连接信息的,系统会自动记录;
        对于默认的数据库连接,内部的数据库编号是0;
        CONNECTION与模型中定义connection属性一样,支持数组,字符串和调用配置参数三种;
        切换数据库使用$this->db(DB_IS)->query()格式;
        切换数据库后的表与当前表不同,使用table(TB_NAME)设置对应的表名;
    M(TB_NAME,FIX,CONNECTION):
        CONNECTION与连接数据库中M()一样,支持三种配置;
分布式数据库:
    配置DB_DEPLOY_TYPE=1,支持分布式;
    分布式数据库必须是相同的的数据库类型;
    连接数据库的个数取决于DB_HOST的数量,即使使用两个相同的IP也要重复定义,其它参数可以不重复定义;
    默认情况下分布式数据库读写不分离,每台服务器都可进行读写操作,DB_RW_SEPARATE=>TRUE设置读写分离;
    在读写分离情况下,默认第一个数据库配置是主服务器,负责写入;
    如果设置DB_MASTER_NUM参数,则支持多个猪服务器写入,其它都是从数据库的配置信息,负责读取数据,数量不限,读取操作时将随机从从数据库中选择;
    主从数据库的数据同步工作不在框架实现,需要数据库考虑自身的同步或者复制机制;
    系统会自动判断当前执行的方法的读操作还是写操作;
创建数据:
    $mdo->create($data);
    $mdo->data($data);
    $mdo->add();
    $mdo->save();
字段映射:
    将表单字段映射为数据库表字段。格式为:
    protected $_map=array(表单字段=>数据库字段);
    $mdo->parseFiledsMap($data):将数据表字段转化为其所对应的表单映射字段;
连贯操作:
    where:用于查询或者更新条件的定义。参数:字符串、数组和对象;
    table:用于定义要操作的数据表名称。参数:字符串和数组;
    alias:用于给当前数据表定义别名。参数:字符串;
    data:用于新增或者更新数据之前的数据对象赋值。参数:数组和对象;
    field:用于定义要查询的字段(支持字段排除)。参数: 字符串和数组:
    order:用于对结果排序。参数:字符串和数组;
    limit:用于限制查询结果数量。参数:字符串和数字;
    page:用于查询分页(内部会转换成limit)。参数:字符串和数字;
    group:用于对查询的group支持。参数:字符串;
    having:用于对查询的having支持。参数:字符串;
    join*:用于对查询的join支持。参数:字符串和数组;
    union*:用于对查询的union支持。参数:字符串、数组和对象;
    distinct:用于查询的distinct支持。参数:布尔值;
    lock:用于数据库的锁机制。参数:布尔值;
    cache:用于查询缓存。参数:支持多个参数;
    relation:用于关联查询(需要关联模型支持)。参数:字符串;

posted on 2012-09-08 11:11  柳風  阅读(333)  评论(0)    收藏  举报