[英]How can I implement model revisions in Laravel?
這個問題是針對我用PHP編寫的pastebin應用的。
我進行了一些研究,盡管找不到符合我需求的解決方案。 我有一個具有這種結構的表:
+-----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+----------------+
| id | int(12) unsigned | NO | PRI | NULL | auto_increment |
| author | varchar(50) | YES | | | |
| authorid | int(12) unsigned | YES | | NULL | |
| project | varchar(50) | YES | | | |
| timestamp | int(11) unsigned | NO | | NULL | |
| expire | int(11) unsigned | NO | | NULL | |
| title | varchar(25) | YES | | | |
| data | longtext | NO | | NULL | |
| language | varchar(50) | NO | | php | |
| password | varchar(60) | NO | | NULL | |
| salt | varchar(5) | NO | | NULL | |
| private | tinyint(1) | NO | | 0 | |
| hash | varchar(12) | NO | | NULL | |
| ip | varchar(50) | NO | | NULL | |
| urlkey | varchar(8) | YES | MUL | | |
| hits | int(11) | NO | | 0 | |
+-----------+------------------+------+-----+---------+----------------+
這是針對pastebin應用程序的。 我基本上希望粘貼修訂,以便如果您打開粘貼#1234,它會顯示該粘貼的所有過去修訂。
我想到了三種方式:
方法1
有一個帶有id和old_id或其他內容的修訂表,對於每個ID,我都會插入所有舊修訂,因此,如果我的結構如下所示:
rev3: 1234
rev2: 1233
rev1: 1232
該表將包含以下數據:
+-------+----------+
| id | old_id |
+-------+----------+
| 1234 | 1233 |
| 1234 | 1232 |
| 1233 | 1232 |
+-------+----------+
我的問題是它引入了很多重復數據。 修訂得到的越多,它不僅具有更多的數據,而且我需要為修訂表中的每個新粘貼執行N次插入,這對於較大的N行而言並不理想。
方法2
我可以將child_id添加到頂部的粘貼表中,然后對其進行更新。 然后,在獲取粘貼時,我將繼續在數據庫中查詢每個child_id及其child_id,依此類推……但是問題是,每次打開具有多個修訂版本的粘貼時,都會引入太多的DB讀取。
方法3
還涉及一個單獨的修訂表,但是對於與方法1相同的情況,它將存儲如下數據:
+-------+-----------------+
| id | old_id |
+-------+-----------------+
| 1234 | 1233,1232 |
| 1233 | 1232 |
+-------+-----------------+
當有人打開粘貼1234時,我將使用IN子句在那里獲取所有子粘貼數據。
哪種方法最好? 還是有更好的方法? 我正在使用具有雄辯的ORM的Laravel 4框架。
編輯 :我可以與oneToMany關系做方法1嗎? 我知道我可以使用“ 急切加載”來獲取所有修訂,但是如何插入它們而不必進行骯臟的修改?
編輯 :我想通了如何處理以上。 我將添加一個答案以結束該問題。
如果您使用Laravel 4,請嘗試Revisionable 。 這可能適合您的需求
所以這是我在做什么:
說這是修訂流程:
1232 -> 1233 -> 1234
1232 -> 1235
因此,我的修訂表如下所示:
+----+--------+--------+
| id | new_id | old_id |
+----+--------+--------+
| 1 | 1233 | 1232 |
| 2 | 1234 | 1233 |
| 3 | 1234 | 1232 |
| 4 | 1235 | 1232 |
+----+--------+--------+
ID 2和3表明,當我打開1234時,它應該在列表上同時顯示1233和1232作為修訂。
現在執行一下:我將使Paste模型與Revision模型具有一對多關系。
我也正在考慮在“查看粘貼”頁面的“修訂歷史記錄”部分中顯示每個修訂的作者,因此我想我還將在修訂表中添加一個“作者”列,這樣我就不必去了返回並查詢主粘貼表以獲取作者。
就是這樣!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.