2017-05-29 103 views
0

我目前对Laravel v5.4.23使用Revisionable Package v1.28.0,这对于大多数情况来说是一对很棒的情侣。Laravel Revisionable - 跟踪“表单输入数组”

但是现在我在修改输入数组时遇到了一些问题。输入元素<input name="company_list[]">不是什么大不了的事,但它对于可修改包是不可见的。所以没有更改写入数据库。请求的dd()显示输入字段的内容。

"company_list" => array:3 [0 => "12", 1 => "10",2 => "2"] 

输入数组将与用户模型同步。

$user->companies()->sync($request->input('company_list',[])) 

有没有办法获得更改并将ID转换为特定名称?

非常感谢!

+0

同步功能应该设置新的列表。所以,如果你在公司表中有一个名称字段,那么你可以执行'$ user-> companies() - > pluck('name')'获得新的公司名单。 – Sandeesh

回答

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);

希望这有助于:)