我有两个具有多对多关系的模型:Project
和User
。
在创建或编辑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>
所以这行得通-但我想知道是否有更好的方法来做到这一点。嵌套的循环感觉很混乱。
有没有更清洁,更有效的方式使用刀片来完成此任务?
答案 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)
语句。这样可以为您节省另一张支票。
希望它能激发您的灵感。