我有多对多的关系,并正在构建一个表单来启用更新。
使用一系列复选框设置关系。
模型为Post
和Category
,并定义了传统的mtm关系。
在我的编辑帖子表格中,我得到了一个类别列表,并急切地将当前选择的类别加载到我的帖子模型中。表格如下:
{!! Form::model($post, ['route' => ['admin.posts.update', $post->id], 'method' => 'PATCH']) !!}
// .. some fields
@foreach ($categoryList as $categoryId => $category)
<div class="checkbox">
<label>
{!! Form::checkbox('category[]', $categoryId, in_array($categoryId, $selected_categories)) !!} {{ $category }}
</label>
</div>
@endforeach
选定的类别定义如下:
$selected_categories = $post->categories->lists('id');
...它给出了一个只有相关类别的id的简单数组。
这导致默认情况下检查所有类别复选框,尽管in_array($categoryId, $selected_categories))
语句只在类别ID相关时才计算为true。如果我将复选框的第一个(名称)参数更改为category[]
以外的其他参数,则会正确检查它们。
为什么表单模型绑定检查所有复选框,以及为什么,即使我尝试通过将第3个参数传递给复选框来覆盖它,它是否没有效果?
答案 0 :(得分:1)
Illuminate的FormBuilder的generate复选框方法中似乎存在一个错误。当您将多选元素(category[]
)传递给该方法时,它会在该数组中查找单词“on”,当然,它会为它生成的每个复选框找到它,即使您只检查过并张贴了一个复选框。
protected function getCheckboxCheckedState($name, $value, $checked) {
if (isset($this->session) && ! $this->oldInputIsEmpty() && is_null($this->old($name))) return false;
if ($this->missingOldAndModel($name)) return $checked;
$posted = $this->getValueAttribute($name);
return is_array($posted) ? in_array($value, $posted) : (bool) $posted;
}
假设您只选中了一个复选框。已发布的复选框数组:
checkbox[0]
checkbox[1]
checkbox[2]
checkbox[3] = 'on' // only value that is ever posted
checkbox[4]
checkbox[5]
数组如下所示:array('checkbox' => [3 => 'on'])
因此in_array('on', [3 => 'on'])
会为所有复选框返回true
。