模型
模型定义
- 命名规则:模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型层的名称(默认定义是Model),例如:
模型名 约定对应数据表(假设数据库的前缀定义是 think_)
UserModel think_user
UserTypeModel think_user_type
模型实例化
在ThinkPHP中,可以无需进行任何模型定义。只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的,因此ThinkPHP在模型上有很多的灵活和方便性,让你无需因为表太多而烦恼。
根据不同的模型定义,我们有几种实例化模型的方法,根据需要采用不同的方式:
- 直接实例化 $User = new \Home\Model\UserModel();
- 带参数实例化New = new \Home\Model\NewModel('blog','think_',connection);
- 数据库连接方式
- 字符串定义:new\Home\Model\NewModel(‘blog’,’think_’,’mysql://root:1234@localhost/demo’);
- 数组定义:
$connection = array(
'db_type' => 'mysql',
'db_host' => '127.0.0.1',
'db_user' => 'root',
'db_pwd' => '12345',
'db_port' => 3306,
'db_name' => 'demo',
);
new \Home\Model\NewModel('new','think_',$connection);
- 配置定义
//数据库配置1
'DB_CONFIG1' => array(
'db_type' => 'mysql',
'db_user' => 'root',
'db_pwd' => '1234',
'db_host' => 'localhost',
'db_port' => '3306',
'db_name' => 'thinkphp'
),
//数据库配置2
'DB_CONFIG2' => 'mysql://root:1234@localhost:3306/thinkphp',
new \Home\Model\NewModel('new','think_','DB_CONFIG1');
new \Home\Model\BlogModel('blog','think_','DB_CONFIG2');
CURD操作
- 数据创建/编辑 user=M(′user); user->create(); $user->add()/save(),根据表单提交的数据自动创建对象,也支持连贯操作,field(),filter(),alias()之类,前提name字段要写对。
- 如果需要更改或添加 $user->name=’wanglas’。
- setField()支持修改单个字段,或者传入数组。
- setInc(),setDec()可传入字段,数量,延迟多久后进行修改(秒)。
- 开启AR(activeRecord模式) user−>where(′id=8′)−>find()等同于 user->find(8); $uer->delete(8);
- 字段映射 : ThinkPHP的字段映射功能可以让你在表单中隐藏真正的数据表字段,而不用担心放弃自动创建表单对象的功能,假设我们的User表里面有username和email字段,我们需要映射成另外的字段,定义方式如下:
namespace Home\Model;
use Think\Model;
Class UserModel extends Model{
protected $_map = array(
'name' =>'username', // 把表单中name映射到数据表的username字段
'mail' =>'email', // 把表单中的mail映射到数据表的email字段
);
}
- 这样在表单里面就可以直接使用name和mail名称作为表单数据提交了。我们使用create方法创建数据对象的时候,会自动转换成定义的实际数据表字段。 同时在读取数据的时候 如果要控制输出对象的字段名称需要开启 ‘READ_DATA_MAP’=>true 或者直接使用parseFieldsMap方法进行转换处理,例如
// 实例化User模型
$User = D('User');
$data = $User->find(3);
$data = $User->parseFieldsMap($data);
引用:
Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。
在计算机领域中,表示编译器为每个被激活的函数分配的内存空间。
活动记录一般都存在栈中。因为栈结构比较简单,硬件能够支持。
Active Record 和 Row Gateway (行记录入口)十分相似,但前者是领域模型,后者是一种数据源模式。关系型数据库往往通过外键来表述实体关系,Active Record 在数据源层面上也将这种关系映射为对象的关联和聚集。
Active Record 适合非常简单的领域需求,尤其在领域模型和数据库模型十分相似的情况下。如果遇到更加复杂的领域模型结构(例如用到继承、策略的领域模型),往往需要使用分离数据源的领域模型,结合 Data Mapper (数据映射器)使用。
Active Record 驱动框架一般兼有 ORM 框架的功能,但 Active Record 不是简单的 ORM,正如和 Row Gateway 的区别。著名的例子是全栈(Full Stack) Web 开发框架 Ruby on Rails ,其默认使用一个纯 Ruby 写成的 Active Record 框架来驱动 MVC 中的模型层。
在 Martin Fowler 的 《企业应用架构模式》 一书中曾详细叙述了本模式。
以下是著名的 Active Record 驱动框架:
SQLObject(Python)
Ruby on Rails ActiveRecord (Ruby)
Yii Framework ActiveRecord (PHP)
Castle ActiveRecord (.NET)