Laravel Revisionable — отслеживание & quot; массива ввода формы & quot;

В настоящее время я использую 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',[]))

Есть ли способ получить изменения и перевести идентификаторы в конкретные имена?

Большое спасибо!

0

Решение

В настоящее время 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);

Надеюсь это поможет 🙂

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]