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();
}
}
});
这代码真的秀到了
保存的时候是提交所有表单项,删除文件的时候提交的字段是特殊设计的几个字段值,把 自动保存字段值 (autoSave) 关掉试试
不管什么框架,先进行 数组校验。数组不校验 表单 就不可能正确。因此你的提交表单数据 有问题,先从这儿排查。
你在php中使用到 js ajax 需要了解 异步和 php同步速度问题,拿不到数据 异步接口和同步接口的优先级。 初步判断应该是,同步表单 比 异步接口数据跑的快!
删除的时候会触发一次只有图片字段的模型保存,在saving顶部判断一下有没有其他字段,如果只有图片字段,就不要走下面的tags处理,直接return
原因是删除图片后,这个图片就不存在了,所以更新了模型的图片字段,如果不更新的话,你点了删除然后不提交,直接刷新网页,再点开时,还按原来的地址显示图片,图片就会加载失败