基于old()或现有数据的多选中的选定选项

时间:2018-08-03 15:20:23

标签: php laravel drop-down-menu eloquent laravel-blade

我有两个具有多对多关系的模型:ProjectUser

在创建或编辑User时,视图中会包含下面的多选字段部分。

它遍历项目并检查old()中是否有数据。如果old()中有数据,它将项目$id与old()中的数组进行比较,并添加所选属性(如果存在)。如果没有旧数据,则会将现有的$ user的项目ID提取到数组中-如果存在,则应用selected属性。

<select class="form-control" id="projects" name="projects[]" multiple>
    @foreach($projects as $id => $name)
        <option value="{{ $id }}" 
        @if(old("projects")) 
            @if(in_array($id, old("projects"))) 
                selected="selected" 
            @endif 
        @else
            @if(in_array($id, $user->projects->pluck('id')->toArray())) 
                selected="selected" 
            @endif
        @endif > {{ $name }}</option>
    @endforeach                
</select>

所以这行得通-但我想知道是否有更好的方法来做到这一点。嵌套的循环感觉很混乱。

有没有更清洁,更有效的方式使用刀片来完成此任务?

1 个答案:

答案 0 :(得分:2)

您可以结合使用单行代码,Laravel集合和Blade指令@php进行代码分解,以在逻辑和显示之间添加额外的分隔层:

<select class="form-control" id="projects" name="projects[]" multiple>
    @foreach($projects as $id => $name)
        @php
            $selected = collect(old('projects'))->contains($id) || $user->projects->pluck('id')->contains($id) ? 'selected="selected"' : '';
        @endphp
        <option value="{{ $id }}" {{ $selected }}> {{ $name }}</option>
    @endforeach                
</select>

刀片式指令@php @endphp使您可以像在家一样工作。 Laravel collect也可以使用null值,因此,如果您的old('projects')为null,则该集合将为空数组,并且不会通过->contains($id)语句。这样可以为您节省另一张支票。

希望它能激发您的灵感。