zoukankan      html  css  js  c++  java
  • 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();

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

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

  • 相关阅读:
    @RequestParam注解使用:Name for argument type [java.lang.String] not available, and parameter name information not found in class file either.
    cglib动态代理导致注解丢失问题及如何修改注解允许被继承
    springboot Autowired BeanNotOfRequiredTypeException
    git根据用户过滤提交记录
    不同包下,相同数据结构的两个类进行转换
    How to use Jackson to deserialise an array of objects
    jooq实践
    java如何寻找main函数对应的类
    Python--matplotlib
    Python 和 Scikit-Learn
  • 原文地址:https://www.cnblogs.com/liushannet/p/1806479.html
Copyright © 2011-2022 走看看