dcat-admin saving问题求助

我现在有一个中间表关键,用来处理文章和标签,这里是显示的部分:

$form->tags('tags','标签')
                ->ajax('/search_tags?type=article')
                ->customFormat(function ($tags) {

                    // 遍历标签 ID 数组并获取标签名称
                    $tagsIds = \DB::table('tag_pivot')->where('source_id', $this->id)->where('type', 'article')->pluck('tag_id');

                    $tagNames = [];

                    foreach ($tagsIds as $tagId) {
                        $tag = Tag::find($tagId);
                        if ($tag) {
                            $tagNames[] = $tag->name;
                        }
                    }

                    // 将标签名称数组转换为逗号分隔的字符串并返回
                    return implode(', ', $tagNames);
                })->required();

然后saving的时候处理一下,看看标签有没有,没有就新建:

$form->saving(function (Form $form) {
                $tags = $form->input('tags');

                // 在保存表单之前移除所有已存在的关系
                $form->model()->tags()->detach();

                // 删除 tags 输入数据以避免更新错误
                $form->deleteInput('tags');

                // 确保 $tags 是一个数组
                if (!is_array($tags)) {
                    $tags = [];
                }

                $tags = array_filter($tags);

                // 存储已经存在的标签 ID 和新创建的标签
                $tagIds = [];

                // 遍历标签并处理
                foreach ($tags as $tag) {
                    if (is_numeric($tag)) {
                        $tagIds[] = $tag;
                    } else {
                        $verifyTag = Tag::firstOrCreate(['name' => $tag]);
                        $tagIds[] = $verifyTag->id;
                    }
                }

                // 将标签 ID 存储在表单对象的一个属性中
                $form->_tagIds = $tagIds;
            });

然后saved的时候处理关联关系:

$form->saved(function (Form $form) {

                // 使用存储在表单对象中的标签 ID
                $tagIds = $form->_tagIds;

                // 更新标签中间表关联关系
                $form->repository()->model()->tags()->attach($tagIds,['type' => 'article']);
                // 更新标签的发布量
                foreach($tagIds as $tagId) {
                    $tagCount = \DB::table('tag_pivot')->where('tag_id', $tagId)->count();

                    $tagDate = Tag::find($tagId);

                    if($tagDate) {
                        $tagDate->post_count = $tagCount;
                        $tagDate->save();
                    }
                }
            });

现在的问题是,删除图片的时候会走saving,然后tags会变成null,然后直接保存tags又是有值的,所以长长造成删除图片的时候tags关系就没有了,为什么删除图片的时候tags会是null呢?直接保存tags是有值的

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

这代码真的秀到了

1年前 评论
wongvio (楼主) 1年前

保存的时候是提交所有表单项,删除文件的时候提交的字段是特殊设计的几个字段值,把 自动保存字段值 (autoSave) 关掉试试

1年前 评论
wongvio (楼主) 1年前
巅峰互联

不管什么框架,先进行 数组校验。数组不校验 表单 就不可能正确。因此你的提交表单数据 有问题,先从这儿排查。

1年前 评论
巅峰互联

你在php中使用到 js ajax 需要了解 异步和 php同步速度问题,拿不到数据 异步接口和同步接口的优先级。 初步判断应该是,同步表单 比 异步接口数据跑的快!

1年前 评论
DogLoML

删除的时候会触发一次只有图片字段的模型保存,在saving顶部判断一下有没有其他字段,如果只有图片字段,就不要走下面的tags处理,直接return

原因是删除图片后,这个图片就不存在了,所以更新了模型的图片字段,如果不更新的话,你点了删除然后不提交,直接刷新网页,再点开时,还按原来的地址显示图片,图片就会加载失败

1年前 评论

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