我试图将复选框组保存为主模型数据库表中的序列化字符串。 AudienceGroups只是我主要雄辩模型的一个属性。如果我只是做
{{Form::checkbox('AudienceGroups[]', 'preschool');}}
{{Form::checkbox('AudienceGroups[]', 'elementary');}}
在我的模型中没有逻辑,然后将数据库列设置为字符串Array
。如果我放下括号并只使用{{Form::checkbox('AudienceGroups', 'preschool');}}
,那么该列将设置为最后一个复选框的值,在我的情况下"老年人"。
如果我在保存模型实例之前序列化数组,它会像它应该的那样保存为序列化数组,但是我无法在页面加载时重新填充正确的复选框(来自旧输入或保存的模型。)
我应该如何攻击这个?自己序列化数组然后使用我自己的逻辑来控制Form :: checkbox()的第三个参数来控制检查状态?如果是这样,有人可以帮助我。我尝试使用Input :: old和in_array但却无法使其工作。
由于
答案 0 :(得分:2)
<强>更新强>
看起来html助手已经从核心仓库中移除而没有被修复。 https://github.com/laravel/framework/issues/5078
我遇到的问题是当使用表单模型绑定时,Form :: checkbox()的第三个参数无法正常工作。
laravel documentation表示值优先级为:
但是,如果你看一下/Illuminate/Html/FormBuilder.php中的getCheckboxCheckedStatus(),你会发现检查状态的优先级实际上是:
明确传递值
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;
}
当我在代码中时,我也看到Laravel内置了in_array,前提是参数是一个数组。所以我在我的控制器中调用View :: make()之前就已经反序列化了$myModelInstance->AudienceGroups
。
答案 1 :(得分:1)
首先,将属性序列化为一列并不是最佳解决方案。你不应该这样做,因为如果你想在DB中搜索这些数据,你将无法做到这一点。
我认为解决问题的方法并不复杂。
我准备了两条简单的路线:
Route::get('/checkbox',function() {
// normally you would get it from model and unserialize it
$fromModel = ['preschool','elementary','something'];
return View::make('form')->with('fromModel',$fromModel);
});
Route::post('/checkbox-post',function() {
$agroups = Input::get('AudienceGroups');
foreach ($agroups as $item) {
echo $item."<br />";
}
$toModel = serialize($agroups);
echo $toModel;
// now you insert it into model
});
并形成:
{{ Form::open(['url' => 'checkbox-post', 'role' => 'form']) }}
Preschool:
{{Form::checkbox('AudienceGroups[]', 'preschool', (in_array('preschool', $fromModel) ? true : false))}}<br />
Elementary:
{{Form::checkbox('AudienceGroups[]', 'elementary', (in_array('elementary', $fromModel) ? true : false))}}<br />
Something else:
{{Form::checkbox('AudienceGroups[]', 'somethingelse', (in_array('somethingelse', $fromModel) ? true : false))}}<br />
Something:
{{Form::checkbox('AudienceGroups[]', 'something', (in_array('something', $fromModel) ? true : false))}}<br />
{{Form::submit('Send')}}
{{ Form::close() }}
您可以使用http://localhost/yourproject/checkbox
运行它 - 表单已初始化,并选中了3复选框。在刀片中,您可以使用in_array
检查正确的复选框,在POST路由中,您可以简单地将此Input::get('AudienceGroups')
用作数组并将其序列化。