Я совершенно новый разработчик Laravel и использую библиотеку VentureCraft Revisionable для записи изменений в модели. Мне нужно записывать ревизии для модели «многие ко многим», и я понимаю, что Revisionable не поддерживает это. Я смотрел на другие библиотеки, и они, кажется, тоже. Есть ли способ, которым я могу это сделать? То есть вносить изменения в сводные таблицы, для которых нет классов моделей?
Извините за широкий вопрос, но я застрял и не знаю, куда идти с этим. Любые советы или полезная документация будет принята с благодарностью.
Я хотел бы использовать библиотеку Revisionable, но на самом деле мне просто нужно добавить запись в таблицу ревизий с данными в соответствующих сводных таблицах, которые изменились, и я понятия не имею, как это сделать. Заранее спасибо.
Хотя в настоящее время нет собственного способа сделать это, есть несколько вариантов. То, что я делаю на некоторых моделях, которые мне нужно было присоединить в ModelA, сохраняет в ModelA (или в любом другом сценарии) глобальную функцию в классе (или использует в helpers.php) для этого:
/**
* Creates a revision record.
*
* @param object $obj
* @param string $key
* @param mixed $old
* @param mixed $new
*
* @return bool
*/
public static function createRevisionRecord($obj, $key, $old = null, $new = null)
{
if (gettype($obj) != 'object') {
return false;
}
$revisions = [
[
'revisionable_type' => get_class($obj),
'revisionable_id' => $obj->getKey(),
'key' => $key,
'old_value' => $old,
'new_value' => $new,
'user_id' => vms_user('id'),
'created_at' => new \DateTime(),
'updated_at' => new \DateTime(),
]
];
$revision = new \Venturecraft\Revisionable\Revision;
\DB::table($revision->getTable())->insert($revisions);
return true;
}
Потом позже просто позвони MyHelperClass::createRevisionRecord()
от моего save()
крюк.
public function save(array $options = [])
{
// $old = $this->getOriginal('key');
// $new = $this->key;
// Let's say this is linked to \App\SomethingElse via 'something_id'
MyHelperClass::createRevisionRecord(\App\SomethingElse::find($this->something_id), 'custom_field', $old, $new);
// Do actual save.
return parent::save($options);
}
Это не самый элегантный способ, но это был мой первый рабочий вариант.
Это сказанное .. Там будет встроенная функциональность для этого в Revisionable v2.0 +, над которым ведется работа!
Других решений пока нет …