模版定义:
模型类的命名规则是:去除前缀的数据库表的名称+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:用于关联查询(需要关联模型支持)。参数:字符串;
浙公网安备 33010602011771号