Kohana 之ORM实际使用篇

上面已经介绍使用了,这里在写个DOME吧,但不可能涉及全部方法使用

就接上面那个例子吧,先把mytest表清掉:

1.创建ORM模块

<?php defined('SYSPATH') or die('No direct access allowed.');

class Model_Mytest extends ORM {
	protected $_ignored_columns = array('c');//排除字段
	protected $_table_name="mytests";//ORM表,不受下面的表名复数影响
	protected $_db="default";//默认数据库连接
	protected $_primary_key="id";//主键字段
	protected $_primary_val="name";//主键值
	protected $_table_names_plural=true;//表名复数
	protected $_sorting=array("a"=>"desc");//排序
	protected $_foreign_key_suffix="_id";//外键连接符
         //以下两项官方文档错误!!!
	protected $_updated_column = array("column"=>"dt","format"=>"Y-m-d H:i:s"); 
	protected $_created_column = array("column"=>"ct","format"=>"Y-m-d H:i:s"); 
	protected $_rules = array(
		'a' => array(
			'not_empty'  => NULL,
			'min_length' => array(2),
			'max_length' => array(255),
		),
		'b' => array(
			'max_length' => array(10),
		),
	);
	protected $_callbacks = array(    'b' => array('visb'),);
	public function visb(Validate $data, $field){//自定义函数校验~
		return $data->alpha($field);
	}
} 

2取得并使用:
<?php
//建立一个新数据,并保存
$orm=ORM::factory("mytest");
$orm->a="a";
$orm->b="a1";
$orm->c="不存在这个字段";
if(!$orm->check()){
	echo "no check";
}
$orm->a="a1";
$orm->save();//保存并使用当前记录
if($orm->saved())
	echo "save succ\n"; 
print_r($orm->as_array());//可以返回当前的插入
//更新记录
$orm->a="a2";//更新a为 aaa
$orm->save();
if($orm->saved())
	echo "save succ\n"; 
$orm1=ORM::factory("mytest");
$orm1->a="b1";
$orm1->b="b1";
$orm1->save();//到这里有两条记录咯
print_r($orm1->as_array());//可以返回当前的插入
$orm1->a="alla";
$orm1->save_all();//把全部a变为了alla
$allobj=$orm1->find_all();//取得全部ORM记录
foreach ($allobj as $v){
	print_r($v->as_array());//打印出来可以看见全部变为alla咯
}
//取得记录并更新
$orm2=ORM::factory("mytest",array("b"=>"b1"));
if($orm2->loaded()){
	print_r($orm2->as_array());//可以看见取得第二条记录
	$orm2->b="b2";
	$orm2->save();
	print_r($orm2->as_array());//可以看见第二条记录已经被修改
	if($orm2->saved()){
		echo "svae succ\n";
	}
	$orm2->values(array("a"=>"a3","b"=>"b3"));
	sleep(3);//为了看自动更新时间有效果没有~
	$orm2->save();
	print_r($orm2->as_array());//第二条记录再次被修改,可以看见ct dt 相差3秒
	if($orm2->saved()){
		echo "save succ \n";
	}
}else
	echo "load fail\n";
//搜索记录
$orm3=ORM::factory("mytest");
$orm3->where("a","=","alla")->find();
if($orm3->loaded()){
	echo "load succ\n-";
}
print_r($orm3->as_array());//可以看见取得第一条记录
echo $orm3->count_all();//查看下有几条记录了(2)
echo $orm3->pk();//在看下当前的ID是多来
print_r($orm3->list_columns());//随便看下表结构吧.
$orm3->delete();//把这个记录删了吧
$orm3->delete_all();//数据没用了,全清掉吧
echo $orm3->last_query();//看下怎么清数据的


未能完整演示所有的功能,遗漏的有:关系,校验~

不打算使用ORM,上面尝试运行后给我的效果不佳~

把关系补上吧:

一对多关系:

在一的ORM原型上添加

protected $_has_many = array('mytest1' => array());

在多的ORM原型上添加

protected $_belongs_to = array('mytest' => array());

现在mytest1的多条记录对应mytest的一条记录

获取mytest1里对应的mytest的一条记录

$mytest1orm->mytest 得到一个mytestorm对象

取得mytestorm对应的多条$mytest1记录

$mytestorm->mytest1->find_all();//得到多条mytest1orm对象

记得上面那个外键连接符吗,作用就在这里

本地ID键值映射到另一个表,就是通过本表名加上面的外键连接符,本例中就是在mytest1表里有一个mytest_id字段

不过你可以通过下面的方法来修改:

在mytest1增加:

<?php
protected $_belongs_to = array('mytest' => array('foreign_key' => 'mytestid'));

这样修改外键

一对一的关系

两个模型相互添加

protected $_has_one = array('mytest1'=> array());

protected $_has_one = array('mytest'=> array());

//得结果的时候无需find()

多对多关系,得有3个表,有一个表存另两个表的联系,KOHANA的AUTH应用就是这个

抄官方手册的一个例子吧:

// student (学生)模型文件

protected $_has_many = array('classes' => array('through' => 'enrollment'));

// class (班级)模型文件

protected $_has_many = array('students' => array('through' => 'enrollment'));

其中 enrollment 表包含两个外键:

class_idstudent_id。在定义关系时,使用 foreign_keyfar_key 覆写了默认值。

例如:


// student (学生)模型文件() (the foreign key refers to this model [student], while the far key refers to the other model [class])


protected $_has_many = array('classes' => array('through' => 'enrollment', 'foreign_key' => 'studentID', 'far_key' => 'classID'));


// class (班级)模型文件


protected $_has_many = array('students' => array('through' => 'enrollment', 'foreign_key' => 'classID', 'far_key' => 'studentID'));

enrollment 模型文件应该这样定义:

// Enrollment 模型同时属于一个 student 和 class

protected $_belongs_to = array('student' => array(), 'class' => array());

获取相关对象:

// 从 student 中获取 classes$student->classes->find_all();

// 从 class 中获取 students$class->students->find_all();

非常详细说明怎么使用,但给我的感觉相当麻烦~~~

校验:用的超级不爽,文档上没有说明怎么得到错误信息~

posted @ 2010-08-23 15:24  liushan  阅读(1092)  评论(0编辑  收藏  举报