首页 > 解决方案 > Laravel:如何处理表单中的重复数据

问题描述

在我的项目中,我必须以多对多关系链接两个不同的模型(A和),并使用具有附加字段(和)以及模型的数据透视表。Badditionaldata1additionaldata2id

我的方法是创建一个表,其中每一行都是一个不同的B条目,并且用户可以为他/她想要与该条目链接的条目添加附加数据A(从 URL 已知myproject/A/{A_id}/linkwithB/)。

表格的每一行都包含几个输入字段,类似于:

<input type="number" 
       name="data[{{ $B->id }}][additionaldata1]"
       value={{ $A->isLinkedWith($B) ? $A->getB($B)->pivot->additionaldata1 : '' }}>

<input type="number" 
       name="data[{{ $B->id }}][additionaldata2]"
       value={{ $A->isLinkedWith($B) ? $A->getB($B)->pivot->additionaldata2 : '' }}>

isLinkedWithgetB是模型中的两个内部方法,A它们告诉我是否$B已经与 链接,如果是,则检索和$A的值。additionaldata1additionaldata2

服务器端,我收到一个数组

AB: [
    B_id_1 => ['additionaldata1': ad1Value, 'additionaldata2': ad2Value], 
    B_id_2 => ['additionaldata1': ad1Value, 'additionaldata2': ad2Value], 
]

这是我所期望的,但我仍然面临两个不同的问题。

Null对比0

additionaldata*我从表单收到的字段被设置为null用户不提供它们时,从而将事情分解到数据库中,其中相应的字段没有设置为nullable(我希望它保持这种方式)。

我想将那些nulls 更改为0s,为此我尝试覆盖prepareForValidation自定义ABFormRequest类中的函数,但由于数据以数组形式出现,因此我无法使用该$request->merge方法,因为我的字段不是t 在请求的“顶级”级别。

验证

在整个视图中,我设置了验证错误反馈,包括

@if($errors->has('additionaldata1'))
   <p class="help is-danger">{{ $errors->first('additionaldata1') }}</p>
@endif

在每个input字段之后。问题是所有字段都被调用additionaldata*(尽管与不同B的 s 相关),最终会显示为每个字段显示的错误反馈,即使是那些实际上有效的字段。

首先,如果你已经走到这一步,我谢谢你。

其次,没有什么是写在石头上的,如果您对不同的方法有建议,我可以把所有东西都扔掉并以不同的方式重建它,但我想知道我是否在做一些完全无用的事情,或者它怎么可能改善。

标签: phplaravelformsvalidationlaravel-5

解决方案


推荐阅读