В настоящее время я использую Revisionable Package v1.28.0 для Laravel v5.4.23, который отлично подходит для большинства ситуаций.
Но теперь у меня возникла небольшая проблема с пересмотром входных массивов. Элемент ввода <input name="company_list[]">
это не большое дело, но его вид невидим для ревизионного пакета. Таким образом, в базу данных не вносятся изменения. dd()
запроса показывает содержимое полей ввода.
"company_list" => array:3 [0 => "12", 1 => "10",2 => "2"]
Входной массив будет синхронизирован с моделью пользователя.
$user->companies()->sync($request->input('company_list',[]))
Есть ли способ получить изменения и перевести идентификаторы в конкретные имена?
Большое спасибо!
В настоящее время revisionable
не поддерживает Много ко многим связи.
Но я решил эту проблему с помощью следующих кодов:
/**
* Make revision and sync for many to many relations
*
* @param string $relation
* @param array $list
* @return array
*/
public function doSync($relation, $list)
{
$rel = $this->{$relation}();
$old = $rel->pluck('id')->implode(',');
$rel->sync($list);
$new = $rel->pluck('id')->implode(',');
storePivotRevision($this, $relation, $old, $new);
}
/**
* Store revision for pivot tables
*
* @param string $relation
* @param string $old
* @param string $new
* @return null
*/
function storePivotRevision($relation, $old, $new)
{
if ($old == $new) {
return;
}
DB::table('revisions')->insert([
'revisionable_type' => get_class($this),
'revisionable_id' => $model->id,
'user_id' => auth()->check() ? auth()->user()->id : null,
'key' => "{$relation}_pivot",
'old_value' => $old,
'new_value' => $new,
'created_at' => now(),
'updated_at' => now(),
]);
}
Сейчас вместо
$user->roles()->sync([1, 2, 3, ...]);
ты можешь использовать
$user->doSync('roles', [1, 2, 3, ...]);
Код написан в основном для всех моделей (не указано для одной), поэтому вы можете поместить их в trait
и назовите это так:
$ model-> doSync (‘many_to_many_relation’, $ listArray);
Надеюсь это поможет 🙂
Других решений пока нет …