如何使用模型绑定中的Laravel复选框组

时间:2014-10-02 14:50:48

标签: forms laravel laravel-4 blade

我试图将复选框组保存为主模型数据库表中的序列化字符串。 AudienceGroups只是我主要雄辩模型的一个属性。如果我只是做

{{Form::checkbox('AudienceGroups[]', 'preschool');}}
{{Form::checkbox('AudienceGroups[]', 'elementary');}}

在我的模型中没有逻辑,然后将数据库列设置为字符串Array。如果我放下括号并只使用{{Form::checkbox('AudienceGroups', 'preschool');}},那么该列将设置为最后一个复选框的值,在我的情况下"老年人"。

如果我在保存模型实例之前序列化数组,它会像它应该的那样保存为序列化数组,但是我无法在页面加载时重新填充正确的复选框(来自旧输入或保存的模型。)

我应该如何攻击这个?自己序列化数组然后使用我自己的逻辑来控制Form :: checkbox()的第三个参数来控制检查状态?如果是这样,有人可以帮助我。我尝试使用Input :: old和in_array但却无法使其工作。

由于

2 个答案:

答案 0 :(得分:2)

<强>更新

看起来html助手已经从核心仓库中移除而没有被修复。 https://github.com/laravel/framework/issues/5078


我遇到的问题是当使用表单模型绑定时,Form :: checkbox()的第三个参数无法正常工作。

laravel documentation表示值优先级为:

  1. 会话Flash数据(旧输入)
  2. 明确传递值
  3. 模型属性数据
  4. 但是,如果你看一下/Illuminate/Html/FormBuilder.php中的getCheckboxCheckedStatus(),你会发现检查状态的优先级实际上是:

    1. 旧输入
    2. 模型数据
    3. 明确传递值

      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;
      }
      

    4. 当我在代码中时,我也看到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')用作数组并将其序列化。