Цикл Laravel 5.2 Как предотвратить дублирование результата?

#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