#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());
Но мне интересно, почему у вас два цикла, а не один:
- В первом цикле должны отображаться все доступные места в автобусе (что правильно)
- Второй цикл повторяется по всем бронированиям, но это делается для каждого свободного места в автобусе (что не нужно / неправильно)
Вместо этого вы должны проверить, зарезервировано ли место, и удалить свой второй цикл:
@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