Laravel比较集合对象并显示更改

时间:2018-10-29 15:12:27

标签: php laravel

我正在使用Laravel和Spatie的Laravel活动日志插件。调用{{$activity->changes}}时,它将产生一个包含所有attributes(它们是数据库表的变更后列)和old组变更前属性的集合。

示例

{
    "attributes": {
        "id":69,
        "first_name":"Duane",
        "last_name":"Bartell",
        "dob":"1986-06-22",
        "unique_id":"DuaneBartell1986-06-22",
        "created_at":"2018-10-23 09:56:54",
        "updated_at":"2018-10-27 08:41:24"
    },
    "old": {
        "id":69,
        "first_name":"Duane",
        "last_name":"Bartell",
        "dob":"1986-06-21",
        "unique_id":"DuaneBartell1986-06-21",
        "created_at":"2018-10-23 09:56:54",
        "updated_at":"2018-10-23 09:56:54"
    }
}

在此示例中,我更改了dob,也更改了unique_id并更新了updated_at时间戳。我要做的是仅显示已作为更改功能更改的属性。

还请记住,属性/列名称将随模型而变化。我需要为每个不同的模型创建某种解决方案,还是可以使用一些通用方法?

修改

此外,在刀片上显示此信息的最佳方法是什么?我正在尝试{{$log->properties->attributes->id}},但无法正常工作。

编辑2:其他信息

上面的示例是刀片中调用{{$activity->changes}}的原始返回。该插件指出调用此函数将返回一个数组,如下所示:

[
   'attributes' => [
        'name' => 'original name',
        'text' => 'Lorum',
    ],
    'old' => [
        'name' => 'updated name',
        'text' => 'Lorum',
    ],
];

我正在尝试不同的方式来提取此数据。使用$attributes = array_get($log->properties, 'attributes.dob');会返回正确的dob,但是出于任何原因,我似乎都无法拉整组attributesold进行比较。

1 个答案:

答案 0 :(得分:0)

第一个答案

示例数据为JSON,因此尚不清楚它们是数组还是对象。在这种情况下,我将像数组一样构建它们,但是将它们强制转换为对象。如果这些是数组,则可以摆脱(object)get_object_vars的调用。

让我们设置测试数据:

$attributes = (object) [
  "id" => 69,
  "first_name" => "Duane",
  "last_name" => "Bartell",
  "dob" => "1986-06-22",
  "unique_id" => "DuaneBartell1986-06-22",
  "created_at" => "2018-10-23 09:56:54",
  "updated_at" => "2018-10-27 08:41:24"
];

$old = (object) [
  "id" => 69,
  "first_name" => "Duane",
  "last_name" => "Bartell",
  "dob" => "1986-06-21",
  "unique_id" => "DuaneBartell1986-06-21",
  "created_at" => "2018-10-23 09:56:54",
  "updated_at" => "2018-10-23 09:56:54"
];

$result = (object) [
  'attributes' => $attributes,
  'old' => $old
];

现在,我们有一个$result对象,它具有两个属性。每个属性都是一个对象,其中包含示例中的键。

要找到差异,可以执行以下操作:

$changedFields = array_diff(
    get_object_vars($result->attributes), 
    get_object_vars($result->old)
);

现在$changedFields将包含三个属性,作为更改的数组。

第二个答案

在不知道对象的确切结构以及用于将数据插入视图中的代码的情况下,我无法确切地告诉您如何通过刀片访问它。请记住,如果它是一个对象,则可以使用此->指向它-但是,如果它是一个数组,则必须使用数组语法。