|
楼主 |
发表于 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);
复制代码
点此下载示例代码 |
|