Kohana 之ORM文档篇

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());

结果打印:(我表里有随便填的数据)
Array ( [id] => 1 [a] => aaaaaa [b] => aaaaaaaaaa ) ;
 
还有非常多方法,不介绍啦.自己翻手册,有时间在下面补上吧.
 
$orm->delete(1);//删除指定ID
$orm->delete_all()//删除整个表记录
echo ($orm->count_all());//得到表总记录
$orm->last_query()//最后一次请求的SQL
$orm->list_columns()//取得字段名
........
这里附上官网的一些说明:
下面的属性是用于配置每个模型的:
类型 属性 描述 默认值
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();

使用 UpdatedCreated

_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');

原文地址:https://www.cnblogs.com/liushannet/p/1806281.html