kohanaORM实际使用
上面已经介绍使用了,这里在写个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增加:
这样修改外键
一对一的关系
两个模型相互添加
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_id
和 student_id
。在定义关系时,使用 foreign_key
和 far_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();
非常详细说明怎么使用,但给我的感觉相当麻烦~~~
校验:用的超级不爽,文档上没有说明怎么得到错误信息~