ORM 我的理解就是关系数据对象模型,就是把数据库记录映射成对象,把对数据库的操作转化为对对象的操作,
有时候感觉很累赘,不灵活,某种程度上来说也是有好处的,有高手有更好理解的,欢迎拍砖
ORM这个玩意据说在单元测试下不是很理想,没有实际测过,单元测试耗时间,
加上上面只关心结果不关心过程的压力下,放弃测试,管他呢
下面说说实际使用,TNND,官网连个ORM的教程都不出,搞的我摸黑
建立ORM原型,在model下
<?php defined('SYSPATH') or die('No direct access allowed.'); class Model_Mytest extends ORM { protected $_rules = array( 'a' => array( 'not_empty' => NULL, 'min_length' => array(1), 'max_length' => array(255), ), 'b' => array( 'max_length' => array(10), ), ); }
还有很多其他的设置,不在介绍,自己看代码去,呵呵
建立一个表:
CREATE TABLE IF NOT EXISTS `ko_mytests` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` char(255) NOT NULL, `b` char(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM
在控制器中使用:
<?php $orm=ORM::factory("mytest"); print_r($orm-> find(1)->as_array());
结果打印:(我表里有随便填的数据)
类型 | 属性 | 描述 | 默认值 |
---|---|---|---|
string | _table_name | 表名 | singular model name |
string | _db | 数据库配置名 | default |
string | _primary_key | 主键 | id |
string | _primary_val | 主键值 | name |
bool | _table_names_plural | 表名是否是复数形式 | TRUE |
array | _sorting | 列名 => 排序方向的数组 | primary key => ASC |
string | _foreign_key_suffix | 外键的后缀 | _id |
加载一条记录:
// 加载 ID 为 5 的用户
$user = ORM::factory('user', 5);// 检查用户是否加载成功
// 加载 email 为 oe@example.com 的用
$user
= ORM::factory(
'user'
,
array
(
'email'
=>
'joe@example.com'
));
if
(
$user
->loaded()) { ... }//用于判断加载记录是否成功
//搜索活跃用户中名为 Bob 的第一条记录
$user
= ORM::factory('user')
->where(
'active'
,
'='
, TRUE)
->where(
'name'
,
'='
,
'Bob'
)
->find();
// 搜索名为 Bob 的所有用户$users = ORM::factory('user') ...
->find_all();
//当你使用 ORM::find_all 搜索一批记录模型,你可以使用迭代从数据库结果中获取每条记录模型:
foreach
(
$users
as
$user
){ ...}
ORM 一个强大的特性是 ORM::as_array 方法,它把返回的记录集转为为一个数组。如果使用了 ORM::find_all 所有的记录都会以数组的形式返回。对于选择列的时候是非常好用的:
// 显示选择列的用户名 (使用 id 作为其值)
ORM::factory(
'user'
)->find_all()->as_array(
'id'
,
'username'
);
// 用户的记录数
$count
= ORM::factory(
'user'
)->where(
'active'
,
'='
, TRUE)->count_all();
所有的模型属性都可以通过 PHP 的魔法方法 __get
和 __set
得到读写权。
$user
= ORM::factory(
'user'
, 5);
// 输出用户名echo $user->name;// 更改用户名
$user
->name =
'Bob'
;
假如保存的信息/属性并不存在于模型表中,使用
_ignored_columns
来忽略数据成员。
protected
$_ignored_columns
=
array
(
'field1'
,
'field2'
, ...)
;
使用 ORM::values 方法设置键-值型数组
$user
->values(
array
(
'username'
=>
'Joe'
,
'password'
=>
'bob'
));
创建并存储记录
// 创建新记录
$user = ORM::factory('user');
$user->name = 'New user';
$user
->save();
// 更新现有记录
$user = ORM::factory('user', 5);
$user
->name =
'User 2'
;
$user
->save();
// 检查记录是否保存成功
if
(
$user
->saved()) { ... }
$user
= ORM::factory(
'user'
);
$user
->name =
'Bob'
;
// 更新所有结果记录的名字为 'Bob'
$user
->where(
'active'
,
'='
, TRUE)->save_all();
使用 Updated
和 Created
列
_updated_column
和 _created_column
变量是用于当模型更新或插入新纪录的时候自动更新设置的字段值。
默认没有使用。如果你想使用:
// date_created 列用于储存创建的时间,使用 TRUE 保存的是时间戳(timestamp)
protected
$_created_column
=
array
(
'date_created'
=> TRUE);
// date_modified 列用于储存最后修改时间。这里的时间设置为使用 date() 格式后的字符串
protected
$_updated_column
=
array
(
'date_modified'
=>
'm/d/Y'
);
(关联有点乱,不介绍~,自己看~)
校验:
ORM 和 Validate 类是紧密结合使用的。ORM 提供以下几种校验方式:(ORM模型里自己添加该属性)
- _rules
- _callbacks
- _filters
- _labels
_rules
protected
$_rules
=
array
(
'username'
=>
array
(
'not_empty'
=>
array
()),
'email'
=>
array
(
'not_empty'
=>
array
(),
'email'
=>
array
()),);
检测并确保 username
字段不为空。检测 email
字段不为空且是有效的 Email 地址格式。
那些传递空值数组用于提供可选的额外参数到校验方法中使用。
_callbacks
protected
$_callbacks
=
array
(
'username'
=>
array
(
'username_unique'
),);
username
字段被传递到了 username_unique
回调函数。如果方法存在于当前模型它就会被调用,否则调用全局函数。.
下面有个小例子:
public
function
username_unique(Validate
$data
,
$field
){
// 确保 username 是唯一的
...}
_filters
:
protected
$_filters
=
array
( TRUE =>
array
(
'trim'
=>
array
()),
'username'
=>
array
(
'stripslashes'
=>
array
()),);
TRUE
值代表 trim
过滤器应用到所有字段。而 username
字段则在校验前使用 stripslashes
过滤。那些传递空值数组用于提供可选的额外参数到校验方法中使用。
检测对象是否通过校验:
if ($user->values($_POST)->check()){
$user
->save();}
你也可是使用 validate()
方法直接访问模型的校验对象:
// 手动添加额外的过滤器
$user->validate()->filter('username', 'trim');