Laravel - 表单输入 - 多个选择一对多关系

dat*_*dan 21 php forms one-to-many laravel

我正在构建的应用程序中的一个要求是表单输入,它为单个字段接收不同数量的项目.例如,我参加的运动是('足球','网球','门球').

可以玩(可以说)有限数量的运动,因此应该从表格输入中的"下拉"类型列表中选择这些项目.

该表格的下游将是两个具有一对多关系的表格.因此,从上面看,"user"表将有一行,而"user_sports"表将有三行.然后,这些将由用户表中的id字段链接.


我无法找到在文档中可以实现的功能(也许我不是在寻找正确的东西).下面是我找到的最接近的,但仅用于从下拉列表中选择单个项目.

http://laravel.com/docs/html#drop-down-lists


是否有一个解决方法可以让我使用Laravel框架启动并运行此表单元素?

或者,是否有其他方法可以实现这种功能,而不会损害用户体验?

小智 54

我同意user3158900,我在使用它的方式上略有不同:

{{Form::label('sports', 'Sports')}}
{{Form::select('sports',$aSports,null,array('multiple'=>'multiple','name'=>'sports[]'))}}
Run Code Online (Sandbox Code Playgroud)

但是,根据我的经验,select的第3个参数只是一个字符串,所以为了重新填充多选的数据,我必须做这样的事情:

<select multiple="multiple" name="sports[]" id="sports">
@foreach($aSports as $aKey => $aSport)
    @foreach($aItem->sports as $aItemKey => $aItemSport)
        <option value="{{$aKey}}" @if($aKey == $aItemKey)selected="selected"@endif>{{$aSport}}</option>
    @endforeach
@endforeach
</select>
Run Code Online (Sandbox Code Playgroud)


Sus*_*yal 44

@SamMonk你的技术很棒.但是你可以使用laravel表单助手来完成.我有顾客和狗的关系.

在你的控制器上

$dogs = Dog::lists('name', 'id');
Run Code Online (Sandbox Code Playgroud)

在客户创建视图上,您​​可以使用.

{{ Form::label('dogs', 'Dogs') }}
{{ Form::select('dogs[]', $dogs, null, ['id' => 'dogs', 'multiple' => 'multiple']) }}
Run Code Online (Sandbox Code Playgroud)

第三个参数接受一个井列表.如果在模型上定义关系,则可以执行以下操作:

{{ Form::label('dogs', 'Dogs') }}
{{ Form::select('dogs[]', $dogs, $customer->dogs->lists('id'), ['id' => 'dogs', 'multiple' => 'multiple']) }}
Run Code Online (Sandbox Code Playgroud)

更新Laravel 5.1

lists方法现在返回一个Collection. 升级到5.1.0

{!! Form::label('dogs', 'Dogs') !!}
{!! Form::select('dogs[]', $dogs, $customer->dogs->lists('id')->all(), ['id' => 'dogs', 'multiple' => 'multiple']) !!}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`lists`已重命名为`pluck`.方法签名是相同的,因此对于laravel 5.4,它将是`$ customer-> dogs-> pluck('id') - > all()`. (11认同)

Ben*_* K. 7

Laravel 4.2

@ SamMonk给出了最好的选择,我按照他的例子构建了最后一段代码

<select class="chosen-select" multiple="multiple" name="places[]" id="places">
    @foreach($places as $place)
        <option value="{{$place->id}}" @foreach($job->places as $p) @if($place->id == $p->id)selected="selected"@endif @endforeach>{{$place->name}}</option>
    @endforeach
</select>
Run Code Online (Sandbox Code Playgroud)

在我的项目中,我将有许多这样的表关系,所以我写了一个扩展来保持它的清洁.要加载它,将它放在一些配置文件中,如"app/start/global.php".我在"app /"目录下创建了一个文件"macros.php",并将其包含在global.php的EOF中

// app/start/global.php
require app_path().'/macros.php';

// macros.php
Form::macro("chosen", function($name, $defaults = array(), $selected = array(), $options = array()){

    // For empty Input::old($name) session, $selected is an empty string
    if(!$selected) $selected = array();

    $opts = array(
        'class' => 'chosen-select',
        'id' => $name,
        'name' => $name . '[]',
        'multiple' => true
    );
    $options = array_merge($opts, $options);
    $attributes = HTML::attributes($options);

    // need an empty array to send if all values are unselected
    $ret = '<input type="hidden" name="' . HTML::entities($name) . '[]">';
    $ret .= '<select ' . $attributes . '>';
    foreach($defaults as $def) {
        $ret .= '<option value="' . $def->id . '"';
        foreach($selected as $p) {
            // session array or passed stdClass obj
            $current = @$p->id ? $p->id: $p;
            if($def->id == $current) {
                $ret .= ' selected="selected"';
            }
        }
        $ret .= '>' . HTML::entities($def->name) . '</option>';
    }
    $ret .= '</select>';
    return $ret;
});
Run Code Online (Sandbox Code Playgroud)

用法

没有预选项目的列表(创建视图)

{{ Form::chosen('places', $places, Input::old('places')) }}
Run Code Online (Sandbox Code Playgroud)

预选(编辑视图)

{{ Form::chosen('places', $places, $job->places) }}
Run Code Online (Sandbox Code Playgroud)

完整用法

{{ Form::chosen('places', $places, $job->places, ['multiple': false, 'title': 'I\'m a selectbox', 'class': 'bootstrap_is_mainstream']) }}
Run Code Online (Sandbox Code Playgroud)


use*_*496 6

多重选择实际上只是带有属性的选择multiple。考虑到这一点,它应该很容易...

Form::select('sports[]', $sports, null, array('multiple'))
Run Code Online (Sandbox Code Playgroud)

第一个参数只是名称,但使用 对其进行后修复[]会在您使用 时将其作为数组返回Input::get('sports')

第二个参数是可选选项的数组。

第三个参数是您想要预先选择的选项数组。

multiple第四个参数实际上是通过将该属性添加到实际的选择元素来将其设置为多选下拉列表。