模型定义
ThinkPHP中的模型类主要用于操作数据表。
模型类通常需要继承系统的\Think\Model类或其子类,下面是一个Home\Model\UserModel类的定义:
namespace Home\Model;
use Think\Model;
class UserModel extends Model{
//表前缀
protected $tablePrefix = 'tp_';
//不带前缀的表名
protected $tableName = 'user';
//完整表名
protected $trueTableName = 'tp_user';
//设置数据库
protected $dbName = 'my_db';
}
如果你的类名和配置文件这些都设置的刚刚好就无需设置上面那些属性。
模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型层的名称(默认定义是Model),例如:
模型名 约定对应数据表(假设数据库的前缀定义是 think_)
UserModel think_user
UserTypeModel think_user_type
实例化模型类
主要使用D方法和M方法
D方法用于具体实例化某个具体的模型类
$user = D('User'); //实例化UserModel类
M方法不加载具体的模型类,性能更高
M('模型名','前缀 可忽略','配置数组 可忽略');
$user = M('mysql.User','tp_'); //实例化mysql数据库中tp_user表
M方法实例化空模型,仅用来执行查询语句
//实例化空模型
$Model = new Model();
//或者使用M快捷方法是等效的
$Model = M();
//进行原生的SQL查询
$Model->query('SELECT * FROM think_user WHERE status = 1');
配置数组定义
$connection = array(
'db_type' => 'mysql',
'db_host' => '127.0.0.1',
'db_user' => 'root',
'db_pwd' => '12345',
'db_port' => 3306,
'db_name' => 'demo',
'db_charset' => 'utf8',
);
字段定义
在非调试模式下,第一次实例化模型类,就会对字段进行缓存。如果字段经常变,不想缓存。可以设置'DB_FIELDS_CACHE'=>false //关闭缓存
如果不希望依赖字段缓存或者想提高性能,也可以在模型类里面手动定义数据表字段的名称,可以避免IO加载的效率开销,例如:
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
protected $fields = array('id', 'username', 'email', 'age');
//给字段定义类型,可以用于验证
protected $fields = array('id', 'username', 'email', 'age',
'_type'=>array('id'=>'bigint','username'=>'varchar','email'=>'varchar','age'=>'int') );
protected $pk = 'id';
protected $pk = array('id','lession_id'); //定义复合主键
}
pk属性定义当前数据表的主键名,默认值就是id,因此如果是id的话可以无需定义。
切换数据库
只需调用Model->db(数据库编号,数据库配置信息);返回当前模型的实例。
内部数据库编号为0.对于已经调用过的,是不需要在设置配置信息的,系统会记录。
例:
$this->db(1,"mysql://root:123456@localhost:3306/test")->table('tp_user')->query('');
$this->db(0); //切换回来
分布式数据库
看文档