2015-02-06 48 views
2

我有一個多對多的關係,並且正在構建一個表單來啓用更新。Laravel表單模型綁定覆蓋默認值

該關係使用一系列複選框進行設置。

該型號爲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[]以外的內容,則會正確檢查它們。

爲什麼表單模型綁定檢查所有複選框,以及爲什麼,即使我嘗試通過將第三個參數傳遞給複選框來覆蓋它,是否沒有效果?

回答

1

Illuminate的FormBuilder的生成複選框方法似乎存在一個錯誤。當您將多選元素(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所有複選框。

+0

嗯,這是一個錯誤報告應張貼的東西?我可能會這樣做。 – harryg 2015-02-06 10:47:36

+0

看起來回購是隻讀的 - 沒有辦法提交問題 – harryg 2015-02-06 10:54:56

+0

但我仍然有點困惑,這是否真的如此。複選框的名稱應該與您是否要檢查它無關...... – silkfire 2015-02-06 10:56:52