首页 > 解决方案 > 两个字段在 Laravel CRUD 中保存时覆盖彼此的值(spatie/laravel-tags 实现问题)?

问题描述

我正在尝试将 spatie/laravel-tags 与 Backpack for Laravel 一起使用。我定义了两种类型的标签。目前,我已将来自 spatie/laravel-tags 的 Tag 模型扩展为 MyCategory 和 MyTag,并添加了全局范围来分隔两种标签类型。这在一定程度上可以在 Backpack 中正确显示当前类别和标签,但是当我尝试保存任何更改时,它只会保存最后一个字段中的条目,并删除第一个字段中的所有内容。

这是我当前的 CRUD 字段配置:

        $this->crud->addField([
            'name' => 'categories',
            'label' => 'Categories',
            'type' => 'select2_multiple',
            'tab' => 'Overview',
            'attribute' => 'name',
            'model' => 'App\MyCategory',
            'pivot' => true,
        ]);

        $this->crud->addField([
            'name' => 'tags',
            'label' => 'Tags',
            'type' => 'select2_multiple',
            'tab' => 'Overview',
            'attribute' => 'name',
            'model' => 'App\MyTag',
            'pivot' => true,
        ]);

当我检查 Laravel Telescope 时,我发现这两个领域都发生了同样的事情。首先,我正在保存的项目的所有当前标签(无论类型)都被删除,并添加来自该字段的新标签。然后对第二个字段重复此操作,这当然会从第一个字段中删除也应保留的标签。

我的扩展标签模型上的 GlobalScope 似乎并没有在这部分停留。有没有办法将范围重新引入背包运行的查询中以正确保存这些标签?

标签: laravellaravel-backpacklaravel-tags

解决方案


在我的 CrudController 中,我创建了自定义更新和存储功能。请参阅下面的更新示例。这似乎工作正常。仍然有 2 个查询正在运行,第二个查询撤消了第一个查询,但就我而言,这是一个足够好的解决方法,可以使用 spatie/laravel 在 Backpack 中以相同的形式拥有 2 个具有不同标签类型的字段-标签。

    public function update(UpdateRequest $request)
    {
        $request = request();

        // Merge the values from the two tag fields together into the second field
        $request->merge(['tags' => array_merge((array)$request->input('categories'), (array)$request->input('tags'))]);

        $redirect_location = $this->traitUpdate($request);

        return $redirect_location;
    }

推荐阅读