Laravel表单模型绑定覆盖默认值

时间:2015-02-06 00:05:39

标签: php laravel laravel-5

我有多对多的关系,并正在构建一个表单来启用更新。

使用一系列复选框设置关系。

模型为PostCategory,并定义了传统的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个参数传递给复选框来覆盖它,它是否没有效果?

1 个答案:

答案 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