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);
});
返回错误:
看情况是不是没做到想要的。
这部分如何处理呀,我当前这种写法是不是保存的类似这样的字符串?{“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');
});
});
啃了几天文档了,没尝试成功。
另外到时候列表页如何展示这部分数据?如图如何实现标签的展示:
看了源代码超级简单,不过我目前实现不了。。。泪奔ing……
博文分类的单选下拉我已经搞定了,结合树型菜单实现。现在这个多选下拉确实没尝试成功。
4. 您实际得到的结果?
希望可以提供这部分的代码实现。能大致讲解下最好了,再次谢谢。
或者帮我先实现写入数据库部分的代码。先按源代码里面的直接存入标签名字字段[‘php’,’laravel’]保存到数据库里。谢谢。
(写的有点乱,改过几次图还搞乱了,希望这次表达的能理解)
customFormat 是显示用的,保存需要 saving 中设置,可以自己处理一下
最后保存添加这个 就可以了 ->saving(function ($value) { // 转化成json字符串保存到数据库 return json_encode($value); });