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

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

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

  • 相关阅读:
    赋值运算 就是 +*/ 什么的啦
    利用application,cookies,sessino以及文件文件操作制作计数器和投票的综合实例(按学习进程更新)
    实现二级联动菜单 C#,带完整数据库 SQL
    写入、读取 cookie 无聊顺便复习了下前面学的东西!
    两级联动菜单之ListBox.item.add做法
    利用textbox接收两个数,列出一个数组,并做简单的运算
    .net服务器控件列表19个
    循环显示checkboxlist控件项的时候,count到底要不要 1
    validation验证控件案例以及正则表达式中几个特殊符号的说明!
    上传文件 动作详解(最简单的这种)
  • 原文地址:https://www.cnblogs.com/liushannet/p/1806479.html
Copyright © 2011-2022 走看看