Laravel атрибуты array_diff - PullRequest
       71

Laravel атрибуты array_diff

0 голосов
/ 01 февраля 2020

Я пытаюсь реализовать черту RecordsActivity, как в примере с Birdboard на Laracasts. Вот код Джеффри , обновленный для Laravel> = 5.7:

/**
 * Fetch the changes to the model.
 *
 * @return array|null
 */
protected function activityChanges()
{
    if ($this->wasChanged()) {

        // weirdness here, see below
        dump(
            $this->oldAttributes, 
            $this->getAttributes(), 
            array_diff($this->oldAttributes, $this->getAttributes())
        );

        return [
            'before' => Arr::except(array_diff($this->oldAttributes, $this->getAttributes()), 'updated_at'),
            'after' => Arr::except($this->getChanges(), 'updated_at')
        ];
    }
}

Приведенный выше dump() дает следующий ответ во время теста (без аннотаций). Ничего не меняется между двумя массивами, и очевидно, что одна строка отличается, но почему-то array_diff не работает.

// $this->oldAttributes
array:14 [
  "name" => "890 Gleichner Lights Suite 446"
  "address" => "890 Gleichner Lights Suite 446"
  "city" => "Mantetown"
  "state" => "CT"
  "postal_code" => "00627"
  "active" => false
]

// $this->getAttributes()
array:14 [
  "name" => "890 Gleichner Lights Suite 446"
  "address" => "Changed"
  "city" => "Mantetown"
  "state" => "CT"
  "postal_code" => "00627"
  "active" => false
]

// array_diff($this->oldAttributes, $this->getAttributes())
[]

1 Ответ

1 голос
/ 01 февраля 2020

Проверьте array_diff

array_diff (массив $ массив1, массив $ массив2 [, массив $ ...]): массив

Сравнивает массив1 с один или несколько других массивов и возвращает значения в массиве1 , которые отсутствуют ни в одном из других массивов.

Так, если установлено значение одного поля пусто, изменить порядок тоже не может, например: установить "address" => "", тогда array_diff($this->getAttributes(), $this->oldAttributes) также вернет [].

array_diff_asso c (массив $ массив1, массив $ массив2 [, массив $ ...]): массив

Сравнивает массив1 с массивом2 и возвращает разницу. В отличие от array_diff () ключи массива также используются в сравнении.

Лучше использовать array_diff_assoc:

$changes = array_diff_assoc($this->oldAttributes(), $this->getAttributes);
...