#laravel
#laravel
Вопрос:
Сценарий — зона содержит несколько городов, у меня проблема в моей форме редактирования.
Проблема в том, что мне нужно добавить города в зону selected=true
и другие города, которые не относятся к зоне, в опции по умолчанию.
Итак, у меня есть 2 цикла, подобных этому
@foreach($cities as $city)
@foreach($zone->cities as $zone_city)
@if($city->id == $zone_city->id)
<option value="{{ $city->id }}" selected="true">{{ $city->name }}</option>
@endif
@endforeach
//if current city id not yet printed before then
<option value="{{ $city->id }}">{{ $city->name }}</option>
@endforeach
$cities
весь ли город, переданный контроллером, имеет значение 1, 2, 3, 4, 5
, а $zone->cities
является ли значение города, который принадлежит зоне, 1, 3, 5
.
С помощью приведенного выше кода я получаю этот результат
<option value="1" selected="true">Surabaya</option>
<option value="1">Surabaya</option>
<option value="2">Sidoarjo</option>
<option value="3" selected="true">Malang</option>
<option value="3">Malang</option>
<option value="4" selected="true">Gresik</option>
<option value="4">Gresik</option>
<option value="5">Madura</option>
результат, которого я ожидал, это
<option value="1" selected="true">Surabaya</option>
<option value="2">Sidoarjo</option>
<option value="3" selected="true">Malang</option>
<option value="4" selected="true">Gresik</option>
<option value="5">Madura</option>
Как исправить мою логику кода цикла?
Спасибо, любая помощь приветствуется.
ОБНОВЛЕНО
Вот мой контроллер редактирования
public function zone_edit($id)
{
$zone = Zone::find($id);
$cities = City::all();
return view('backend.admin.pricings.zone_edit', compact('zone', 'cities'));
}
Ответ №1:
Вы можете попробовать это
В функции вашего контроллера
$zoneCityIds = [];
$zone = Zone::find($id);
$cities = City::all();
foreach ($zone->cities as $zoneCity)
{
$zoneCityIds[] = $zoneCity->id
}
return view('backend.admin.pricings.zone_edit', compact('zone', 'cities','zoneCityIds'));
На ваш взгляд, измените весь свой цикл, как показано ниже
@foreach($cities as $city)
<option value="{{ $city->id }}" @if(in_array($city->id, $zoneCityIds)) selected @endif>{{ $city->name }}</option>
@endforeach
Надеюсь, это поможет 🙂
Комментарии:
1. вы спасли мне день, это работает, но есть ли какое-нибудь приспособление от laravel, которое может сделать это без игры с массивом? Что-то вроде, если коллекция содержит объект или что-то еще.
2. Вы должны выполнять подобные операции в контроллере, сбор laravel — это способ, но в данном случае это не более выгодно
3. Я только что обновил свой вопрос, который показывает мой контроллер редактирования, может быть, вы можете помочь мне перенести эти операции в контроллер.
4. Конечно. Я пытаюсь
5. Пожалуйста, скажите мне, один город принадлежит только одной зоне? тогда я смогу определить некоторую модальную функцию, и это будет более чистый и хороший код.
Ответ №2:
Вы можете заставить это работать следующим образом:
@foreach($cities as $city)
$currentCity = false;
@foreach($zone->cities as $zone_city)
@if($city->id == $zone_city->id)
$currentCity = true;
<option value="{{ $city->id }}" selected="true">{{ $city->name }}</option>
@endif
@endforeach
//if current city id not yet printed before then
@if($currentCity)
<option value="{{ $city->id }}">{{ $city->name }}</option>
@endif
@endforeach
Но я думаю, что это лучший подход, соответствующий вашим потребностям.
@foreach($cities as $city)
@foreach($zone->cities as $zone_city)
<option value="{{ $city->id }}" @if($city->id == $zone_city->id) selected="true" @endif >{{ $city->name }}</option>
@endforeach
@endforeach