我想弄清楚如何爲帖子和其他內容設置修訂系統。我認爲這意味着它需要使用基本的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