首页 > 解决方案 > Laravel Blade:复选框将“空”值发送到数据库

问题描述

我不明白。我的复选框在选中时会向我的控制器发送一个“空”值。如果它在数据库中,它会回来检查,但是当我取消选中它,然后再次检查它时,我的表单发送一个“空”值我做错了什么?

<div class="col">
  <input type="checkbox" name="staff"   @if($child->staff == 'true') checked @endif >
</div>

标签: htmllaravellaravel-blade

解决方案


checked属性仅确定复选框是否应包含在post请求中。该value属性确定复选框的值(如果它checked包含在表单提交中)。

如果您未指定 avalue并且该复选框包含在post请求中,则其值为on

<input type="checkbox" name="staff" id="staff">

"staff" => "on"

如果你想要一个true值,你需要设置它。

<input type="checkbox" name="staff" value="true"
    @if($child->staff == 'true') checked @endif>

即使在上面的示例value中复选框是true,如果不是checked,它将不会包含在提交的表单请求中,因此您有一个false值(技术上)。

更新

我希望能够在真假之间切换。当我将复选框切换为空时,它仍然将空值传递给数据库。有任何想法吗?

复选框值是这样的strings,因此您需要自己执行转换为所需值,然后将其存储在数据库中。可以实现的示例如下:

public function update(Request $request, Staff $staff)
{
    // Perform some validation on the incoming Request
    $request->validate([
        'staff' => ['in:true,false']
    ]);
    
    // Assuming we get here, data is valid
    
    // If the Request object has a key named 'staff'
    // then the checkbox was checked (true).
    // If there is no key named 'staff'
    // then the checkbox was not checked (false)
    $staff->child = $request->has('staff');
}

推荐阅读