我想弄清楚如何为帖子和其他内容设置修订系统。我认为这意味着它需要使用基本的belongs_to/has_one/has_many/has_many_though ORM(任何好的ORM都应该支持这一点)。如何使用ORM设置发布修订/历史跟踪?
我在想一个我能有一个像一些表(含配套机型)
[[POST]] (has_many (text) through (revisions)
id
title
[[Revisions]] (belongs_to posts/text)
id
post_id
text_id
date
[[TEXT]]
id
body
user_id
在那里我可以加入通过修改表以获取最新的文本正文。但是我对它的工作方式有点模糊。有没有人设置这样的东西?
基本上,我需要能够加载文章并请求最新的内容条目。
// Get the post row
$post = new Model_Post($id);
// Get the latest revision (JOIN through revisions to TEXT) and print that body.
$post->text->body;
有能力随时调整回到以前的修订和删除修订也将是一个很大的帮助。
无论如何,这些只是我认为某种历史追踪会起作用的想法。我愿意接受任何形式的跟踪,我只想知道最佳做法是什么。
:编辑:
看来,向前走,两个表似乎最有意义。由于我打算存储文本的两个副本,这也将有助于节省空间。第一个表格posts
将存储当前修订版本的数据以进行快速读取而无需任何连接。帖子body
将是匹配版本的text
字段的值 - 但通过markdown/bbcode/tidy/etc进行处理。这将允许我保留原始文本(用于下一次编辑),而不必在一个修订行中存储该文本两次(或者每次显示时都必须重新解析它)。
所以抓取将是ORM友好的。然后,为了创建/更新,我将不得不分别处理修订版,然后使用新的当前修订版值更新后期对象。
CREATE TABLE IF NOT EXISTS `posts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`published` tinyint(1) unsigned DEFAULT NULL,
`allow_comments` tinyint(1) unsigned DEFAULT NULL,
`user_id` int(11) NOT NULL,
`title` varchar(100) NOT NULL,
`body` text NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `published` (`published`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `postsrevisions` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`post_id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned NOT NULL,
`is_current` tinyint(1) unsigned DEFAULT NULL,
`date` datetime NOT NULL,
`title` varchar(100) NOT NULL,
`text` text NOT NULL,
`image` varchar(200) NOT NULL,
PRIMARY KEY (`id`),
KEY `post_id` (`post_id`),
KEY `user_id` (`user_id`),
KEY `is_current` (`is_current`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
这并不容易弄清楚你想知道:) – 2009-12-22 13:22:04