【问题标题】:Laravel Revisionable - Tracking of "Form Input Array"Laravel Revisionable - 跟踪“表单输入数组”
【发布时间】:2023-03-16 14:53:02
【问题描述】:

我目前正在使用适用于 Laravel v5.4.23 的 Revisionable Package v1.28.0,这对于大多数情况来说都是很好的组合。

但是现在我在修改输入数组时遇到了一点问题。输入元素<input name="company_list[]"> 没什么大不了的,但它对于可修订包来说是不可见的。因此不会将任何更改写入数据库。请求的dd() 显示输入字段的内容。

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

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

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

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

非常感谢!

【问题讨论】:

  • 同步应该设置新列表。因此,如果您在公司表中有名称字段,那么您可以通过 $user->companies()->pluck('name') 获取新的公司名称列表。

标签: php arrays laravel revisionable


【解决方案1】:

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

希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    相关资源
    最近更新 更多