|  | 
 
 
 楼主|
发表于 2012-1-14 17:56:10
|
显示全部楼层 
| 本帖最后由 huboo82 于 2012-1-14 19:41 编辑 
 第二天:建立数据表以及 Datamapper ORM 模型
 
 首先修改 application/config/autoload.php 和 application/config/config.php 文件:
 
 PHP复制代码 复制代码 
/** 修改 autoload.php,为 libraries 增加 session 库
 */
$autoload['libraries'] = array('database', 'session', 'datamapper');
 
/*
 * 修改 config.php,要使用 session 必须得设置一个 encryption_key,这个 key 可以是任意非空字符串
 */
$config['encryption_key'] = 'z6gx2fpuk0xfjq2dcrpd';
 现在可以正式开始设计模型和数据表了。我们需要一个内容表来保存以及显示内容,需要一个用户表来允许授权的用户添加/修改/删除内容,可能还需要一个评论表来保存任何人发表的评论,于是我们的 Datamapper ORM 的模型将是:
 
 PHP复制代码 复制代码 class Content extends DataMapper {
 
 }
 
PHP复制代码 复制代码 class User extends DataMapper {
 
 }
 
PHP复制代码 复制代码 class Comment extends DataMapper {
 
 }
 
 一条内容有一个用户与之关联,所以内容模型与用户模型之间是一对一的关系,反过来,一个用户可能创建了很多条内容,那么用户对内容(相对评论也同样是一对多关系)就是一对多的关系:
 
 PHP复制代码 复制代码 
class Content extends  DataMapper {
     public $has_one = array('user');
}PHP复制代码 复制代码 
class User extends  DataMapper {
     public $has_many = array('content', 'comment');
}PHP复制代码 复制代码 
class Comment extends  DataMapper {
     public $has_one = array('user');
}
 对于评论模型,也许我们只需要一个用户就够了,比如:是哪位用户留下的评论,但是对于内容模型来说,我们除了有一个创建内容的用户以外,可能还需要一个编辑内容的用户,那么就需要用到 Datamapper ORM 的高级关系的内容:
 
 PHP复制代码 复制代码 
class Content extends  DataMapper {
     
    public $has_one = array(
        'creator' => array(
            'class' => 'user',
            'other_field' => 'created_post'
        ),
        'editor' => array(
            'class' => 'user',
            'other_field' => 'edited_post'
        )
    );
     
}PHP复制代码 复制代码 
class User extends  DataMapper {
     
    public $has_many = array(
        'created_post' => array(
            'class' => 'content',
            'other_field' => 'creator'
        ),
        'edited_post' => array(
            'class' => 'content',
            'other_field' => 'editor'
        ),
        'comment'
    );
     
}
 这样我们通过一个 User 的 Datamapper ORM 对象就可以访问到其修改的或创建的内容:$user->created_post->get()。通过上面的过程,我们需要用的的模型已经建立好了,可以根据模型来设计数据库表了。表的字段可以按自己的需要来定制,只是特殊的地方就在于每个表要有一个 ‘id’ 字段以及表关系。我们使用表内外键来关联一对多的关系,所以 contents 表需要有一个 'creator_id' 和 ‘editor_id’ 来关联 users 表。下面是表结构的 sql 脚本:
 
 SQL复制代码 复制代码 --
 -- 数据库: `demo`
 --
 
 -- --------------------------------------------------------
 
 --
 -- 表的结构 `comments`
 --
 
 CREATE TABLE IF NOT EXISTS `comments` (
 `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
 `author` VARCHAR(100) DEFAULT NULL,
 `user_id` INT(10) UNSIGNED DEFAULT NULL,
 `text` text NOT NULL,
 `created` datetime NOT NULL,
 PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 
 -- --------------------------------------------------------
 
 --
 -- 表的结构 `contents`
 --
 
 CREATE TABLE IF NOT EXISTS `contents` (
 `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
 `title` VARCHAR(100) NOT NULL,
 `text` text NOT NULL,
 `created` datetime DEFAULT NULL,
 `updated` datetime DEFAULT NULL,
 `creator_id` INT(10) UNSIGNED DEFAULT NULL,
 `editor_id` INT(10) UNSIGNED DEFAULT NULL,
 PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 
 -- --------------------------------------------------------
 
 --
 -- 表的结构 `users`
 --
 
 CREATE TABLE IF NOT EXISTS `users` (
 `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
 `username` VARCHAR(100) NOT NULL,
 `password` VARCHAR(100) NOT NULL,
 PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 
 现在开始在 welcome controller 中测试一下是否运行正常吧。
 
 新建一个用户:
 
 PHP复制代码 复制代码 // 实例化一个 User Datamapper ORM 模型,并设置用户的用户名和密码,然后保存它
 $user = new User();
 $user->username = 'huboo';
 $user->password = '123456';
 
 // 保存这个用户,如果出错打印出错信息,否则打印保存的用户信息
 if($user->save())
 {
 echo $user->id . '<br />';
 echo $user->username . '<br />';
 echo $user->password;
 }
 else
 {
 echo $user->error->string;
 }
 
 新建一条内容并与刚刚创建的用户关联
 
 PHP复制代码 复制代码 // 如果以上没有出错就可以进行下面的测试
 // 新建一条内容,并与该用户关联,使该用户为这条内容的创建者
 $post = new Content();
 $post->title = 'First post';
 $post->text = 'First post content. blablabla...';
 
 // 保存用户的关联,之后查看一下数据库的 Contents 表,应该多了一条记录,并且在 created 字段里自动加上了时间戳
 $post->save_creator($user);
 
 点此下载示例代码
 | 
 |