Как передать несколько строковых значений в checkbox?

#php #laravel

#php #laravel

Вопрос:

Я разрабатываю систему бронирования мест в автобусе, проблема заключается в получении значений забронированных мест из имени таблицы столбцов ‘seat’, называемого ‘booking’, здесь все значения вставляются с использованием метода implode (‘,’, $ seat), поэтому, если я передам одно значение в view, оно покажет забронированное место, но если передать несколько строк, оно не будет отображаться. Я знаю, что это строка, так что есть какой-либо другой способ сделать это? массив у меня не сработал.

Вставить

 $booking = new Bookings();
$booking->users_id = 4;
$booking->schedules_id = $schedules_id;
$booking->buses_id = $buses_id;
$booking->routes_id = $routes_id;
$booking->seat = implode(',', $seat);
$booking->price = $request->price;
$booking->profile = 'pending';
  

Собирать

 $seat = $request->seat;
$buses_id = $request->buses_id;
$schedules_id = $request->schedules_id;
$data = Buses::where('buses_id', $buses_id)->first();
$seat = json_decode($data->seat_layout, true);
$front = json_decode($data->front_layout, true);
$bookingSeat = Bookings::where('schedules_id', $schedules_id)->get();

return view('frontend.booking', ['seat' => $seat, 'buses_id' => $buses_id, 'schedules_id' => $schedules_id, 'front' => $front, 'bookingSeet'=>$bookingSeat]);
  

blade.php

 <div class="bus">
  @foreach($seat as $key => $item)
  @foreach($bookingSeet as $seer)
    <div class="col-md-1">
      <div class="seats back seats 
      @if($item['name'] == $seer['seat'])
      activeSeat
      @endif"
      data-id="{{$key}}">
        <div class="special-attributes"></div>
        @if(isset($item['name'])){{$item['name']}}@else 11A @endif

       <input type="checkbox" name="seat_id[]" id="{{$key}}" value="{{$key}}">

      </div>
    </div>
  @endforeach
  @endforeach
</div>

  

Ответ №1:

если место размещения записи является массивом, и вы сохраняете его как строку implode,

итак, при выборке перебираем все места бронирования и разбиваем их обратно на массив

 $bookingSeat = Bookings::where('schedules_id', $schedules_id)->get();
$bookingSeat = $bookingSeat->map(function($bookSeat) {
      $bookSeat->seat = explode(",", $bookSeat->seat);
      return $bookSeat;
});
  

а затем в блейде проверьте, находится ли место в_array

 @if(in_array($item['name'], $seer['seat']))
  

Комментарии:

1. ваш ответ работает для меня, но prb заключается в том, что когда я вставляю новое значение, создается новая строка, но я использовал метод updateOrCreate (‘schedules_id’ => $ schedules_id), но теперь существующие данные заменены новыми данными, как это решить?

2. это зависит от ваших потребностей и структуры вашей таблицы… 1) сначала вы можете проверить, существует ли этот конкретный schedules_id уже во вкладке Bookings на not, а затем решить, следует ли вставлять или обновлять. 2) ИЛИ вы всегда можете удалить с помощью schedules_id, а затем вставить.

3. да, если schedules_id уже существует, необходимо объединить старые и новые данные в один столбец, я пробовал несколько способов, но это заменит существующие данные новыми

Ответ №2:

Вы implode вводите места в строку, но вы не explode вводите их перед передачей в свой интерфейс. Я предполагаю, что эту строку следует изменить, чтобы она работала должным образом:

 $bookingSeat = explode(',', Bookings::where('schedules_id', $schedules_id)->get());
  

Но мне интересно, почему у вас два цикла, а не один:

  1. В первом цикле должны отображаться все доступные места в автобусе (что правильно)
  2. Второй цикл повторяется по всем бронированиям, но это делается для каждого свободного места в автобусе (что не нужно / неправильно)

Вместо этого вы должны проверить, зарезервировано ли место, и удалить свой второй цикл:

  @if(in_array($item['name'], bookingSeet))
     <input type="checkbox" name="seat_id[]" id="{{$key}}" value="{{$key}}" checked="checked">
 @else
     <input type="checkbox" name="seat_id[]" id="{{$key}}" value="{{$key}}">
 @endif