我的个人博客:逐步前行STEP

有时候我们使用Laravel-admin管理数据时,需要保存一些通过程序运算出来的数据,而不只是存储写在表单中的数据,也就是需要在保存数据前可以设置或改变数据。
比如存在这么个需求:

为了快速创建\管理一些测试数据,在Admin管理端创建一个用户账户的同时,创建相关的用户信息,用户订单、地址库等等一系列信息。

以这个需求中用户关联的数据量来说,每个数据都手动输入的话,效率太低了,所以只能自动创建。
所以实现的思路是这样的,表单中只有用户的基本信息,其它的订单、地址都是在执行store函数前自动生成的,然后关联保存即可。
先看Form.php的store函数源码:

public function store(){$data = Input::all();......}

数据来源是request对象,所以,轻而易举地想到:

在store之前往request中塞入订单、地址的关联数据

这个数据的格式在我的另一篇博文中有详细解释:laravel-admin grid中使用switch操作一对一关联属性,但是执行提交后发现并没有成功保存,于是走一波源码调试。
首先看到更新关联模型数据的代码:

 public function store(){......DB::transaction(function () {$inserts = $this->prepareInsert($this->updates);foreach ($inserts as $column => $value) {$this->model->setAttribute($column, $value);}$this->model->save();//在这里保更新关联模型$this->updateRelation($this->relations);});
......}

继续进入updateRelation方法跟踪:

protected function updateRelation($relationsData){foreach ($relationsData as $name => $values) {if (!method_exists($this->model, $name)) {continue;}$relation = $this->model->$name();//在这里判定是否是一对一$oneToOneRelation = $relation instanceof Relations\HasOne|| $relation instanceof Relations\MorphOne|| $relation instanceof Relations\BelongsTo;//在这里做一个预处理$prepared = $this->prepareUpdate([$name => $values], $oneToOneRelation);//预处理的结果为空则没有后续处理if (empty($prepared)) {continue;}

经过打断点调试,发现我在store之前插入的订单、地址关联数据并没有通过预处理,所以再来看看prepareUpdate预处理是什么鬼:

protected function prepareUpdate(array $updates, $oneToOneRelation = false){$prepared = [];/** @var Field $field *///$this->builder->fields() 就是表单字段相关属性foreach ($this->builder->fields() as $field) {$columns = $field->column();//这个是字段名称了// If column not in input array data, then continue.if (!array_has($updates, $columns)) {//关键在这,如果表单字段不在request的数据中就过滤掉continue;}......}

在上面的注释中,清楚地表明了一个状况:

form表单的提交保存只能保存表单中有的字段,不然都会被过滤掉。

所以,我们需要让Laravel-admin认为我们表单中有订单、地址关联字段,根据我们的需求,很容易想到使用hidden组件:

只要把所有关联关系需要更新的字段都使用hidden列出来即可,不需要赋值

而且在store前,如果根据某些条件不需要保存这个关联关系的话,直接使用request的offsetUnset将那个关联关系整体删除即可。

Laravel-admin 使用表单动态地保存一个关联模型(源码探究到功能实现)相关推荐

  1. vue大括号里接受一个函数_vue源码探究(第四弹)

    vue源码探究(第四弹) 结束了上一part的数据代理,这一部分主要讲讲vue的模板解析,感觉这个有点难理解,而且内容有点多,hhh. 模板解析 废话不多说,先从简单的入手. 按照之前的套路,先举一个 ...

  2. Laravel-admin 表单保存一对多关联数据(源码探究到功能实现)

    我的个人博客:逐步前行STEP 由于Laravel-admin只支持表单保存一对一关联数据,要想保存一对多关联数据,还得从了解它的源码入手,看有没有空子可钻. 首先,进入源码中的Form.php的st ...

  3. [动态代理三部曲:下] - 从动态代理,看Retrofit的源码实现

    前言 关于动态代理的系列文章,到此便进入了最后的"一出好戏".前俩篇内容分别展开了:从源码上,了解JDK实现动态代理的原理:以及从动态代理切入,学会看class文件结构的含义. 如 ...

  4. Online Coding开发模式 (通过在线配置实现一个表模型的增删改查功能,无需写任何代码)

    JEECG 智能开发平台. 开发模式由代码生成器转变为Online Coding模式                      (通过在线配置实现一个表模型的增删改查功能,无需一行代码,支持用户自定义 ...

  5. 分享网上找到的一个中国象棋源码

    代码的结构挺好,mvc模式的,给大家分享出来 原创不易,转载请注明出处:分享网上找到的一个中国象棋源码 部分代码 Controller.java package com.zuidaima.chess. ...

  6. 独家一比一精仿火萤动态壁纸全套微信小程序源码下载-支持动静态和头像

    独家一比一精仿火萤动态壁纸全套微信小程序源码下载-支持动静态和头像 这是一款完美还原火萤动态壁纸小程序 支持的功能有如下 动态壁纸(独家采集) 静态壁纸(独家采集) 精选头像(独家采集) 每一个功能里 ...

  7. 小程序源码:独家一比一精仿火萤动态壁纸全套微信小程序源码下载-支持动静态和头像

    这是一款完美还原火萤动态壁纸小程序 支持的功能有如下 动态壁纸(独家采集) 静态壁纸(独家采集) 精选头像(独家采集) 每一个功能里面都包含了多个分类 支持搜索,再也不怕找不到自己想要的关键词的壁纸或 ...

  8. 月老在线脱单交友盲盒php网页版源码

    月老在线脱单交友盲盒php网页版源码,请看清楚!!!!! 是无授权,无加密,免公众号登录的全开原程序源码,也不是网上流传的Thinkphp框架结构 程序可对接易支付及第三方支付,环境配置简单,新手易上 ...

  9. android flv 编码器,Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载)...

    Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载) 项目地址 https://github.com/979451341/RtmpSave 这个项目主要代码 ...

最新文章

  1. Spring Initializr 构建Spring Boot/Cloud工程
  2. 国际顶级学界业界大咖云集,9 场技术论坛布道,2019 嵌入式智能国际大会强势来袭!...
  3. oracle ora 14452,ORA-14452的出现原因解析及解决方法
  4. Func vs. Action vs. Predicate [复制]
  5. linux中的查找文件夹
  6. QT 在定义新的类型时候,注意了(定义了ReadXml),在实现的时候加上Qlabel
  7. 可怕的乖孩子_小说《可怕的乖孩子》讲了一个什么故事?
  8. 第十一章 图形视图、动画、状态机框架
  9. Redis入门,Redis的安装
  10. 删除数据所有的表和存储过程
  11. navigationBar模块未绑定
  12. MATLAB 插值函数运用 - interp1
  13. Pr对图像元素进行裁剪
  14. Android烧录镜像文件介绍
  15. 2021-2025年中国休闲凉鞋行业市场供需与战略研究报告
  16. (三)常见的数字逻辑电路器件及属性
  17. 关于如何用vscode使用Competitive Programming Helper (cph)插件以及网页插件competitive-companion实现高效刷题
  18. 联想ThinkPad声音扬声器正常但是不能发出声音,插入耳机有声音
  19. CSS box-shadow 详解
  20. Matlab的数据导入与拟合

热门文章

  1. 垃圾模块清理工具小程序功能模块0.33
  2. 响应式优化透明版表白网html单页源码
  3. 汇成企业网站管理系统v1.0源码
  4. 苹果cms v8模板 高仿爱奇艺带PC+手机模板
  5. WordPress主题 酱茄模块源码
  6. 打印异常堆栈_定位生产问题时,异常堆栈莫名丢了,何解?
  7. jQuery Ajax - ajax()方法,参数注释
  8. DolphinPHP
  9. 酱茄企业官网多端开源小程序源码 v1.0.0
  10. Spring Cloud微服务再谈微服务架构(七)