【问题标题】:Laravel Compare Collection Objects and Display ChangesLaravel 比较集合对象和显示变化
【发布时间】:2018-10-29 15:12:26
【问题描述】:

我正在使用 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}} 的原始返回。该插件声明调用它会返回一个 ARRAY,如下所示:

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

我正在尝试不同的方法来提取这些数据。使用$attributes = array_get($log->properties, 'attributes.dob'); 将返回正确的dob,但无论出于何种原因,我似乎无法将attributes 的整个组拉出来与old 进行比较。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    第一个答案

    示例数据是 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 将包含三个属性作为已更改的数组。

    第二个答案

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

    【讨论】:

    • 我用一些信息更新了这个问题。文档说它是一个数组,但我无法引用属性/旧方面。
    猜你喜欢
    • 2018-11-20
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 2015-04-02
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多