用户
 找回密码
 入住 CI 中国社区
搜索
查看: 8249|回复: 5
收起左侧

从头细说 Kohana php 的 ORM

[复制链接]
发表于 2009-3-17 16:29:02 | 显示全部楼层 |阅读模式
本帖最后由 pat 于 2009-4-1 16:15 编辑

官方支持网站:http://bsdcn.com/index.php
Kohana 答疑(QQ群:58987322)
一直以来都想整理些ORM资料,现在刚好在做一个项目。利用业余时间整理+翻译一些文档。时间有限,进度可能会很慢。



对象关系映射(ORM)


    对象关系映射(ORM)允许你象操作PHP对象一样对数据库进行操作和控制。

    一旦定义好ORM之间的关系,你就可以从数据库中获取数据,操纵返回结果,保存修改后的结果到数据库中,这一切都不需要使用SQL语句。

    按照一定的转换约定建立模型之间的关系,大多数重复的SQL语句(CRUD)都可以被缩减或取消。所有的关系自动的被ORM地组织起来,以使你可以通过标准的存取方法操纵他们。


目录

  • 起步走
  • 使用ORM
  • 示例
  • 扩充话题
起步走

我应该使用ORM吗?使用ORM与否取决于你的产品需求和对性能的要求。
KohanaORM大大减少你在操作数据库时的代码,特别在表单提交中,建立,获取,编辑,删除等表单。ORM能加快你的开发速度、减少bug,但它不能提高SQL运行效率,事实上它可能总会降低产品的运行效率。



《待续》



《Kohana 快速上手网络培训教程》

官方支持网站:
http://bsdcn.com/index.php

讲师:pat(QQ:235749),1998年至今一直从事Linux(FreeBSD) + Apache + PHP + MySQL的开发及项目工作;
授课方式:通过看文档、解读源码、实例项目相结合,进行语音、视频教学;
授课周期:一周。一周学不会者,可以继续学习;
授课时间:每天晚上8点授课,一周3次新内容,时间提前通知,学会为止;
感兴趣者,请加我的QQ:235749 及 技术交流QQ群:5898732

本通知长期有效。欢迎转发。
 楼主| 发表于 2009-3-17 16:33:21 | 显示全部楼层
PHP复制代码
 
--
-- 表的结构 `groups`
--
 
CREATE TABLE IF NOT EXISTS `groups` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `groupname` varchar(32) NOT NULL,
  `description` varchar(96) NOT NULL,
  `sort_id` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `uniq_groupname` (`groupname`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
 
--
-- 导出表中的数据 `groups`
--
 
INSERT INTO `groups` (`id`, `groupname`, `description`, `sort_id`) VALUES
(1, '组一', '', 0),
(2, '组二', '', 0);
 
-- --------------------------------------------------------
 
--
-- 表的结构 `groups_users`
--
 
CREATE TABLE IF NOT EXISTS `groups_users` (
  `user_id` smallint(5) unsigned NOT NULL,
  `group_id` tinyint(3) unsigned NOT NULL,
  PRIMARY KEY  (`user_id`,`group_id`),
  KEY `fk_group_id` (`group_id`),
  KEY `fk_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
--
-- 导出表中的数据 `groups_users`
--
 
INSERT INTO `groups_users` (`user_id`, `group_id`) VALUES
(1, 1),
(1, 2);
 
-- --------------------------------------------------------
 
--
-- 表的结构 `roles`
--
 
CREATE TABLE IF NOT EXISTS `roles` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `parent_id` int(11) unsigned NOT NULL default '0',
  `rolename` varchar(32) NOT NULL,
  `controller` varchar(32) NOT NULL,
  `function` varchar(32) NOT NULL,
  `sort_id` int(10) unsigned NOT NULL default '0',
  `description` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `uniq_rolename` (`rolename`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
 
--
-- 导出表中的数据 `roles`
--
 
INSERT INTO `roles` (`id`, `parent_id`, `rolename`, `controller`, `function`, `sort_id`, `description`) VALUES
(1, 0, '基本功能', '', '', 0, ''),
(2, 1, '登录', 'user', 'login', 0, ''),
(3, 1, '修改密码', 'user', 'password', 0, ''),
(4, 2, '超级登录', 'user', 'supper', 0, '');
 
-- --------------------------------------------------------
 
--
-- 表的结构 `roles_users`
--
 
CREATE TABLE IF NOT EXISTS `roles_users` (
  `user_id` smallint(5) unsigned NOT NULL,
  `role_id` tinyint(3) unsigned NOT NULL,
  PRIMARY KEY  (`user_id`,`role_id`),
  KEY `fk_role_id` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
--
-- 导出表中的数据 `roles_users`
--
 
INSERT INTO `roles_users` (`user_id`, `role_id`) VALUES
(1, 2),
(1, 3);
 
-- --------------------------------------------------------
 
--
-- 表的结构 `users`
--
 
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `username` varchar(32) NOT NULL,
  `password` char(32) NOT NULL,
  `sort_id` int(10) unsigned NOT NULL default '0',
  `created` datetime default NULL,
  `updated` datetime default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `uniq_username` (`username`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
 
--
-- 导出表中的数据 `users`
--
 
INSERT INTO `users` (`id`, `username`, `password`, `sort_id`, `created`, `updated`) VALUES
(1, 'pat', '', 0, NULL, NULL),
(2, 'pat2', '', 0, NULL, NULL),
(3, 'pat3', '', 0, NULL, NULL);
 
 
复制代码
 楼主| 发表于 2009-3-17 16:34:50 | 显示全部楼层
本帖最后由 pat 于 2009-3-17 16:39 编辑

2#楼(沙发)中建立了几个表结构是下文要用到的。

用户\组\角色

这里忽略数据类型,所以不用管InnoDB  还是其他。

先建立几个表之间的关系。


PHP复制代码
 
<?php
class Model_User extends ORM {
        protected $has_many = array('logs');
        protected $has_and_belongs_to_many = array('groups', 'roles');
}
 
复制代码



PHP复制代码
 
 
<?php
class Model_Role extends ORM_Tree {
        protected $has_and_belongs_to_many = array('users');
        protected $children = 'roles';
}
 
复制代码



PHP复制代码
 
 
<?php
class Model_Group extends ORM {
        protected $has_and_belongs_to_many = array('users');
 
}
 
复制代码
 楼主| 发表于 2009-3-17 16:41:04 | 显示全部楼层
占位。占位。
发表于 2010-6-30 11:44:50 | 显示全部楼层
怎么不继续讲了呢,期待后面的内容。
发表于 2012-2-16 22:52:24 | 显示全部楼层
广告

本版积分规则