Dcat admin保存下拉选框多选 (multipleSelect)遇到的问题

1. 运行环境

Windows10 +Laragon + Laravel8

1). 当前使用的 Laravel 版本?

Laravel8

2). 当前使用的 php/php-fpm 版本?

PHP 版本:7.4.19

php-fpm 版本:不详

3). 当前系统

Windown10

4). 业务环境

开发环境

5). 相关软件版本

MySQL 5.7.33

2. 问题描述?

Dcat admin在保存下拉选框多选 (multipleSelect)是遇到的问题。

博文信息表Blogs:
id,
title,博文标题
content,博文内容
tag_id,标签id(想通过一对多来保存标签信息)(varchar类型)

博文标签表
id,
name(标签名)

在App\Admin\Controllers\Blogcontroller.php中,

use App\Models\Tag as ModelTag;

protected function form()
{
    return Form::make(new Blog(['tag']), function (Form $form) {
        $form->display('id');
        $form->text('title');
        $form->multipleSelect('tag.name', '博文标签')->options(ModelTag::pluck('name', 'id'));
    });
}

应该是数据需要处理保存,这个时候直接点提交,数据表tag_id(varchar)字段位空。

想着把数据转换成字符串保存到数据库,

$form->multipleSelect('tag.name', '博文标签')->options(ModelTag::pluck('name', 'id'))->saving(function ($value) {
                // 转化成json字符串保存到数据库
                return json_encode($value);
            });

返回错误:

Dcat admin保存下拉选框多选 (multipleSelect)遇到的问题

看情况是不是没做到想要的。
这部分如何处理呀,我当前这种写法是不是保存的类似这样的字符串?{“1”:”laravel”,”2”:”PHP”}
会不会保存直接保存成数组更好[1,2]如果保存数组列表页如何展示呀?下面这种写法对么?

$form->multipleSelect('tag.name', '博文标签')->options(ModelTag::pluck('name', 'id'))->saving(function ($value) {
                // 转化成json字符串保存到数据库
                $value = array_column($value, 'id');
                return json_encode($value);
            });

目前这两种方法我都没提交成功。
如果对应提交成功了,在列表页如何展示,我看Demo源代码保存的标签是直接保存的name字段,如果要直接保存标签名是不是这样写?

$form->multipleSelect('tag.name', '博文标签')->options(ModelTag::pluck('name', 'id'))->saving(function ($value) {
                // 转化成json字符串保存到数据库
                $value = array_column($value, 'name');
                return json_encode($value);
            });

到时候表格里就可以$grid->column(‘label’)->explode()->label();调用了

3. 您期望得到的结果?

有那位知道Dcat如何保存多选下拉数据呀,多选里面对应的就是id,name(标签id,标签名称)。
这种数据是保存{“1”:”laravel”,”2”:”PHP”}这样的json字符串好呢,还是提取出来标签id,然后保存数组格式的字符串[1,2,3]好一些呀?
好像是文档这部分代码

return Form::make(Post::with('tags'), function (Form $form) {
    ...

    $form->multipleSelect('tags')
        ->options(Tag::all()->pluck('name', 'id'))
        ->customFormat(function ($v) {
            if (! $v) {
                return [];
            }

            // 从数据库中查出的二维数组中转化成ID
            return array_column($v, 'id');
        });
});

啃了几天文档了,没尝试成功。

另外到时候列表页如何展示这部分数据?如图如何实现标签的展示:

Dcat admin保存下拉选框多选 (multipleSelect)遇到的问题

看了源代码超级简单,不过我目前实现不了。。。泪奔ing……

博文分类的单选下拉我已经搞定了,结合树型菜单实现。现在这个多选下拉确实没尝试成功。

4. 您实际得到的结果?

希望可以提供这部分的代码实现。能大致讲解下最好了,再次谢谢。
或者帮我先实现写入数据库部分的代码。先按源代码里面的直接存入标签名字字段[‘php’,’laravel’]保存到数据库里。谢谢。
(写的有点乱,改过几次图还搞乱了,希望这次表达的能理解)

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

customFormat 是显示用的,保存需要 saving 中设置,可以自己处理一下

1年前 评论
kindiaing (楼主) 1年前
iwzh (作者) 1年前
jockechen

最后保存添加这个 就可以了 ->saving(function ($value) { // 转化成json字符串保存到数据库 return json_encode($value); });

10个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!