在 Laravel 4 中处理 Input::all() 中的复选框

Posted

技术标签:

【中文标题】在 Laravel 4 中处理 Input::all() 中的复选框【英文标题】:Handle checkboxes in Input::all() in Laravel 4 【发布时间】:2013-08-22 07:21:33 【问题描述】:

我想用以下代码更新我的模型:

$feature = Feature::find($id)->update(Input::all());

这适用于除“完成”字段之外的所有字段,“完成”字段是表中的布尔值,由编辑表单中的复选框表示。

 Form::label('done', 'Done?')
 Form::checkbox('done',1)

如何使用 update 和 Input:all() 处理复选框?

谢谢。

【问题讨论】:

我建议你避免使用Input::all()。这样,您就允许任何对 html 了解最少的人更新在您的模型上不应编辑的字段。即使你在你的模型上定义$accessible,也太冒险了。 感谢您的建议。我将只对那些用户可以编辑的模型使用Input:all()。因此,不应由用户编辑的属性将受到保护。 在使用 Input::all() 时,在模型中使用 $fillable 数组是个好主意。来自文档:“可填充属性指定哪些属性应该是可批量分配的。这可以在类或实例级别设置。可填充的反面受到保护,并用作“黑名单”而不是白名单。” 【参考方案1】:

我找到了解决方法

 Form::hidden('done', 0); 
 Form::checkbox('done', 1); 

【讨论】:

这就是办法! 如果你勾选了'done'并且验证失败,它们不会都被自动填充为1吗?然后下一次提交,如果他们取消选中它并不重要,它仍然会被视为已选中。一种解决方法是手动添加隐藏输入的 HTML,以避免在验证后填充它。 请注意,如果您在编辑记录时使用 Form::model,这将导致问题(至少在 Laravel 5 中),因为如果“完成”,模型会自动将隐藏值更改为 1之前设置为 1。如果您使用 <input type="hidden" name="done" value="0">,它可以避免 Form::model 覆盖值的任何问题。【参考方案2】:

我在保存前快速检查一下。

if(!Input::get('someCheckbox')) $feature->someCheckbox = 0;

【讨论】:

【参考方案3】:

我知道这是旧的,但我发现这种方式在填写表单数据时效果最好

$myModel->fill(array_merge(['checkBoxName1'=>'0','checkBoxName2'=>'0'], $request->all()));

或者如果是 OP,它会是这样的:

 $feature = Feature::find($id)->update(array_merge(['checkBoxName1'=>'0','checkBoxName2'=>'0'],Input::all()));

我只是喜欢它而不是添加隐藏字段。

【讨论】:

以上是关于在 Laravel 4 中处理 Input::all() 中的复选框的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 5.4 + vueJS 中处理表单验证错误

laravel5.4 关于执行删除管理员时候被删用户如果当时是登陆状态还可以操作的处理

在 Laravel 4 中缓存视图输出

在 Laravel 4 中给出 403 Forbidden 错误的单一路线

Laravel 4 中的 Eloquent 调用:处理多个表中的单个列

Laravel 4 中的多个身份验证会话