簡體   English   中英

如何在Laravel中實施模型修訂?

[英]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模型具有一對多關系。

  • 當為現有粘貼創建新修訂時,我將運行批處理插入,不僅添加當前的new_id和old_id對,而且將當前的new_id與與old_id相關聯的所有修訂配對。
  • 當我打開粘貼時(這將通過查詢new_id來完成),從本質上來說,我將獲得修訂表中的所有關聯行(使用定義了hasMany('Revision','new_id')的粘貼模型中的函數),並顯示為用戶。

我也正在考慮在“查看粘貼”頁面的“修訂歷史記錄”部分中顯示每個修訂的作者,因此我想我還將在修訂表中添加一個“作者”列,這樣我就不必去了返回並查詢主粘貼表以獲取作者。

就是這樣!

有一些很棒的軟件包可以幫助您保持模型修訂:

  • 如果只想保留模型修訂,可以使用:

可修改的

  • 如果您還希望使用自定義數據記錄其他任何操作,則可以使用:

Laravel活動記錄器

榮譽獎:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM