Laravel Сравнение объектов коллекции и отображения изменений - PullRequest
0 голосов
/ 29 октября 2018

Я использую плагин Laravel и Spatie в Laravel Activity Log. При вызове {{$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, но по какой-то причине я не могу вытащить полную группу attributes для сравнения с old.

1 Ответ

0 голосов
/ 29 октября 2018

Первый ответ

Примером данных является 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 будет содержать три свойства в виде измененного массива.

Второй ответ

Не зная точной структуры объекта и кода, который вы использовали для вставки данных в представление, я не могу точно сказать вам, как получить к нему доступ через blade-сервер. Помните, если это объект, вы можете указать на него этим -> - но если это массив, вы должны использовать синтаксис массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...