Я реализую ЖУРНАЛ событий, происходящих в системе. Другими словами, определить момент создания объекта и сохранить созданные данные. Когда приходит обновление, мне нужно сохранить предыдущее состояние объекта и новое. Поскольку я использую ресурсы API с пользовательскими реализациями данных, я повторно использую их для сбора всей необходимой информации.
public function update(Request $request, Attendant $attendant)
{
$attendantData = $request->input('attendant');
$prevResource = new AttendantResource($attendant);
$attendant = AttendantService::Update($attendant, $attendantData);
$resource = new AttendantResource($attendant);
$this->createLog($prevResource, $resource);
return $resource;
}
В предыдущем коде создайте новый ресурс перед изменением помощника. Но в итоге $prevResource и $resource имеют одинаковые данные. Информация от $prevResource обновлена до O.
Есть ли способ клонировать модель? или вместо этого есть ли способ предотвратить обновление ссылки из $prevResource?






Используйте обозреватели моделей laravel (https://laravel.com/docs/5.8/eloquent#observers), чтобы наблюдать за событиями в моделях и регистрировать то, что вам нужно.
Вы можете наблюдать created, creating, updated, updating, deleted, deleting, saved, saving события.
При использовании наблюдателя creating или updating вы можете получить предыдущее значение атрибута модели с помощью $model->getOriginal('attribute').
Это мне очень помогло.
На мой взгляд, это не способ справиться с проблемой такого типа (в контроллере).
Что вы на самом деле хотите сделать, так это зарегистрировать прослушиватель событий, который ведет журнал при обновлении вашей красноречивой модели. Есть и модельные «наблюдатели».
Есть библиотека, которая уже обрабатывает специфика того, как заставить все это работать вместе, которое как минимум может служить примером того, как все настроить, но уже способно делать то, что вы хотите.
Вот конкретная документация по "Регистрация событий модели".
Преимущество использования Spatie Logger заключается в том, что он проявляется как простая черта, которую вы добавляете к своей модели. Вот пример кода из документации:
use Illuminate\Database\Eloquent\Model;
use Spatie\Activitylog\Traits\LogsActivity;
class NewsItem extends Model
{
use LogsActivity;
protected static $logAttributes = ['*'];
protected static $logAttributesToIgnore = ['text'];
protected static $logOnlyDirty = true;
}
Это иллюстрирует несколько различных настроек, включая использование $logOnlyDirty, которое будет регистрировать только измененные элементы, в отличие от значения по умолчанию, предоставляющего полное до/после объекта. Вы также можете игнорировать определенные атрибуты, которые вам не нужны (например, временные метки или вычисляемые поля).
Да, но моя главная проблема в том, что мне по-прежнему нужны предыдущие значения, даже с модельными отношениями наряду с новыми значениями. Это потому, что они должны иметь возможность сравнивать предыдущие данные и новые данные одновременно в случае обновления.
Регистрация включает просмотр данных до/после. Это внутренне связано с общей идеей обработки этого события. Вы можете думать о них как о версии триггеров базы данных Eloquent, если вы знаете, что это такое.
Это удивительный подход. Знаете ли вы, могу ли я получить предыдущие значения объекта до обновления? stackoverflow.com/questions/17367383/… Я прочитал этот ответ, но не знаю, возвращает ли эта функция первые созданные данные или предыдущие данные до последнего обновления.