Laravel-admin 使用表单动态地保存一个关联模型(源码探究到功能实现)
我的个人博客:逐步前行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 使用表单动态地保存一个关联模型(源码探究到功能实现)相关推荐
- vue大括号里接受一个函数_vue源码探究(第四弹)
vue源码探究(第四弹) 结束了上一part的数据代理,这一部分主要讲讲vue的模板解析,感觉这个有点难理解,而且内容有点多,hhh. 模板解析 废话不多说,先从简单的入手. 按照之前的套路,先举一个 ...
- Laravel-admin 表单保存一对多关联数据(源码探究到功能实现)
我的个人博客:逐步前行STEP 由于Laravel-admin只支持表单保存一对一关联数据,要想保存一对多关联数据,还得从了解它的源码入手,看有没有空子可钻. 首先,进入源码中的Form.php的st ...
- [动态代理三部曲:下] - 从动态代理,看Retrofit的源码实现
前言 关于动态代理的系列文章,到此便进入了最后的"一出好戏".前俩篇内容分别展开了:从源码上,了解JDK实现动态代理的原理:以及从动态代理切入,学会看class文件结构的含义. 如 ...
- Online Coding开发模式 (通过在线配置实现一个表模型的增删改查功能,无需写任何代码)
JEECG 智能开发平台. 开发模式由代码生成器转变为Online Coding模式 (通过在线配置实现一个表模型的增删改查功能,无需一行代码,支持用户自定义 ...
- 分享网上找到的一个中国象棋源码
代码的结构挺好,mvc模式的,给大家分享出来 原创不易,转载请注明出处:分享网上找到的一个中国象棋源码 部分代码 Controller.java package com.zuidaima.chess. ...
- 独家一比一精仿火萤动态壁纸全套微信小程序源码下载-支持动静态和头像
独家一比一精仿火萤动态壁纸全套微信小程序源码下载-支持动静态和头像 这是一款完美还原火萤动态壁纸小程序 支持的功能有如下 动态壁纸(独家采集) 静态壁纸(独家采集) 精选头像(独家采集) 每一个功能里 ...
- 小程序源码:独家一比一精仿火萤动态壁纸全套微信小程序源码下载-支持动静态和头像
这是一款完美还原火萤动态壁纸小程序 支持的功能有如下 动态壁纸(独家采集) 静态壁纸(独家采集) 精选头像(独家采集) 每一个功能里面都包含了多个分类 支持搜索,再也不怕找不到自己想要的关键词的壁纸或 ...
- 月老在线脱单交友盲盒php网页版源码
月老在线脱单交友盲盒php网页版源码,请看清楚!!!!! 是无授权,无加密,免公众号登录的全开原程序源码,也不是网上流传的Thinkphp框架结构 程序可对接易支付及第三方支付,环境配置简单,新手易上 ...
- android flv 编码器,Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载)...
Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载) 项目地址 https://github.com/979451341/RtmpSave 这个项目主要代码 ...
最新文章
- Spring Initializr 构建Spring Boot/Cloud工程
- 国际顶级学界业界大咖云集,9 场技术论坛布道,2019 嵌入式智能国际大会强势来袭!...
- oracle ora 14452,ORA-14452的出现原因解析及解决方法
- Func vs. Action vs. Predicate [复制]
- linux中的查找文件夹
- QT 在定义新的类型时候,注意了(定义了ReadXml),在实现的时候加上Qlabel
- 可怕的乖孩子_小说《可怕的乖孩子》讲了一个什么故事?
- 第十一章 图形视图、动画、状态机框架
- Redis入门,Redis的安装
- 删除数据所有的表和存储过程
- navigationBar模块未绑定
- MATLAB 插值函数运用 - interp1
- Pr对图像元素进行裁剪
- Android烧录镜像文件介绍
- 2021-2025年中国休闲凉鞋行业市场供需与战略研究报告
- (三)常见的数字逻辑电路器件及属性
- 关于如何用vscode使用Competitive Programming Helper (cph)插件以及网页插件competitive-companion实现高效刷题
- 联想ThinkPad声音扬声器正常但是不能发出声音,插入耳机有声音
- CSS box-shadow 详解
- Matlab的数据导入与拟合