簡體   English   中英

具有一對多關系的Laravel可修改模型

[英]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.

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