[英]Laravel revisionable models with one-to-many relationship
可修改是否可以跟蹤一對多關系的變化? 例如:
型號:用戶。 型號:帖子。 用戶模型使用Venturecraft \\ Revisionable \\ RevisionableTrait; 並且與帖子有很多關系。 如果添加或更新帖子,是否可以通過該帖子所屬的用戶下的可修改版本進行跟蹤?
提前致謝
我能夠想出一些東西。 然而,這不是最優雅的解決方案,所以如果有人幫我清理它(特別是那個未設置困擾我的話)會很棒。
我的解決方案將在Model所屬的表中創建重復項。 我不知道這是不是你想要的
您需要做的第一件事是在適當的表中添加一個可為空的datetime revision_at
列。
特質本身很簡單。 我們使用模型boot()
方法來注冊模型updating
事件。 只要模型即將更新,它就會觸發。 這正是我們所需要的,因為我們在第一次創建模型時不需要修訂。
<?php
trait RevisionableTrait {
public static function boot()
{
parent::boot();
static::updating(function( $model ){
// Grab the original Model and unset the id
// from it, so that we don't get duplicate
// entries when we create a new model.
$attributes = $model->getOriginal();
unset( $attributes['id'] );
// Next we need to add the date the revision
// was created
$attributes['revision_at'] = new DateTime();
$revision = new static($attributes);
$revision->save();
});
}
}
我們在這里做的唯一事情是在分配新字段之前獲取原始模型,取消設置id以確保我們不創建重復條目,設置revision_at
字段的當前時間並保存模型。
基本上就是這樣。
可以通過帖子所屬的用戶下的可修改跟蹤嗎?
這是自動完成的,因為新版本模型仍然屬於相應的用戶,
如果要對其進行微調,可以為修訂創建一個專用表,其中存儲了對模型的引用。 但是存儲屬性可能會有點困難(也許你可以將它們存儲為序列化)。
另一種可能的改進是修改特征中模型的getter方法。 例如,讓all()
僅返回沒有修訂的模型。 然后添加一個withRevisions()
方法來抓取它們。 如果你看看Laravel如何處理Soft Deletes,你可以從中提取邏輯。 它完全一樣。
為什么不用這個?
$user = User::first();
$user->posts->map(function($post) {
return $post->revisionHistory;
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.