我如何才能获得可修订包中的最新一组更改?

How do I get just the most recent set of changes in the revisionable package?

目前我有可修改的特性,可以正确地存储和获取模型经历变化的历史。

模型的每次更新都会为每个更改的字段创建一条记录。

是否可以按更改对这些记录进行分组?

示例时间:

第 1 轮

$model = MyModel::find(1);
$model->a = 5;
$model->b = 6;
$model->save();

这会产生以下条目

+----------+--------+-----+-----------+-----------+--------------+
| rev_type | rev_id | key | old_value | new_value |  created_at  |
+----------+--------+-----+-----------+-----------+--------------+
| MyModel  |      1 | a   |         0 |         5 | [first date] |
| MyModel  |      1 | b   |         0 |         6 | [first date] |
+----------+--------+-----+-----------+-----------+--------------+

第二轮

$model = MyModel::find(1);
$model->a = 555;
$model->b = 666;
$model->save();

这会产生以下条目

+----------+--------+-----+-----------+-----------+---------------+
| rev_type | rev_id | key | old_value | new_value |  created_at   |
+----------+--------+-----+-----------+-----------+---------------+
| MyModel  |      1 | a   |         0 |         5 | [first date]  |
| MyModel  |      1 | b   |         0 |         6 | [first date]  |
| MyModel  |      1 | a   |         5 |       555 | [second date] |
| MyModel  |      1 | b   |         6 |       666 | [second date] |
+----------+--------+-----+-----------+-----------+---------------+

在这种情况下,我只想抓取记录 3 和 4。

最初的想法包括按 created_at 日期获取和分组,然后简单地获取最后一组(最近的日期)。但是我不知道是否可以保证日期相同。

有没有办法在从 revisionable 中检索历史记录时按更新分组?

编辑

经过更深入的调查 - 可修改的 created_at 日期正在使用内置的 ->withTimestamps() 特征。对于批量插入中的每个插入(就像一个可修改的使用),一个新的时间戳被抓取为 Carbon 日期,这意味着(根据我的理解)批量插入可以有不同的 created_at 日期。

有两种可能:

第一个: 您搜索最新条目

$latestDate = Changes::orderBy('created_at' 'desc')->first()->created_at;
$latestEntries = Changes::where('created_at', $latestDate)->get();

但这不是 100% 好,因为当插入之间的时间发生变化时,您会得到错误的结果。

所以最好这样使用:

添加另一列用于计算更改。每次您进行更改(在您的情况下添加 2 行新行)时,您都会将整数增加 1。所以您知道首先进行哪些更改,然后再进行更改,依此类推。

//get the latest changes
$latestChange = Changes::orderBy('created_at' 'desc')->first()->saveId;
$latestEntries = Changes::where('savedId', $latestChange)->get();