У меня есть регистрационная форма для регистрации пользователя на конгрессе ниже. Существует 4 различных сценария регистрации. Таким образом, регистрационная форма должна обрабатывать эти 4 различных сценария. Но он не работает, работает только сценарий 1.
Вы знаете, как реализовать этот сценарий?
Сценарий 1: (единственный сценарий, который работает нормально)

Сценарий 2:
Сценарий 3:

Сценарий 4:

Выбранные билеты с предыдущей страницы доступны в переменной "$selectedTypes".
// регистрационная форма на странице registration.blade.php
<form method = "post" id = "step1form" action = "">
{{csrf_field()}}
@if (!empty($allParticipants))
@if ($allParticipants == 1)
<p>Please fill in all fields. Your tickets will be sent to
p{{ (\Auth::check()) ? Auth::user()->email : old('email')}}.</p>
@foreach($selectedTypes as $k => $selectedType)
@foreach(range(1,$selectedType['quantity']) as $val)
<h6>Participant - {{$val}} - {{$k}}</h6>
<div class = "form-check">
<input class = "form-check-input" type = "radio" name = "payment_method" value = "referencias">
<label class = "form-check-label d-flex align-items-center" for = "exampleRadios1">
<span class = "mr-auto">Fill the following fields with the authenticated user information.</span>
</label>
</div>
<div class = "form-group font-size-sm">
<label for = "participant_name" class = "text-gray">Name</label>
<input type = "text" name = "participant_name[]" required class = "form-control" value = "">
</div>
<div class = "form-group font-size-sm">
<label for = "participant_surname" class = "text-gray">Surname</label>
<input type = "text" required class = "form-control" name = "participant_surname[]" value = "">
</div>
<input type = "hidden" name = "ttypes[]" value = "{{ $selectedType['id'] }}"/>
@foreach($selectedType['questions'] as $customQuestion)
<div class = "form-group">
<label for = "participant_question">{{$customQuestion->question}}</label>
<input type = "text"
@if ($customQuestion->pivot->required == "1") required @endif
class = "form-control" name = "participant_question[]">
<input type = "hidden" name = "participant_question_required[]"
value = "{{ $customQuestion->pivot->required }}">
<input type = "hidden" value = "{{ $customQuestion->id }}" name = "participant_question_id[]"/>
</div>
@endforeach
@endforeach
@endforeach
@else
<p>Its not necessary aditional info. Your tickets will be sent to {{ (\Auth::check()) ? Auth::user()->email : old('email')}}.</p>
@endif
@endif
<input type = "submit" href = "#step2"
id = "goToStep2Free" class = "btn btn-primary btn float-right next-step" value = "Go to step 2"/>
</form>
// registration.blade.php полный метод регистрации пользователя в конгрессе
public function StoreUserInfo(Request $request, $id, $slug = null, Validator $validator){
$allParticipants = Congress::where('id', $id)->first()->all_participants;
$user = Auth::user();
if ($allParticipants){
$rules = [
'participant_name.*' => 'required|max:255|string',
'participant_surname.*' => 'required|max:255|string',
];
$messages = [
'participant_question.*.required' => 'The participant is required'
];
foreach ($request->participant_question_required as $key => $value) {
$rule = 'string|max:255'; // I think string should come before max
//dd($value);
// if this was required, ie 1, prepend "required|" to the rule
if ($value) {
$rule = 'required|' . $rule;
}
// add the individual rule for this array key to the $rules array
$rules["participant_question.{$key}"] = $rule;
}
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->passes()) {
$registration = Registration::create([
'congress_id' => $id,
'main_participant_id' => $user->id,
'status' => 'C',
]);
$participants = [];
for ($i = 0; $i < count($request->participant_name); $i++)
$participants[] = Participant::create([
'name' => $request->participant_name[$i],
'surname' => $request->participant_surname[$i],
'registration_id' => $registration->id,
'ticket_type_id' => $request->rtypes[$i]
]);
for ($i = 0; $i < count($request->participant_question); $i++)
$answer = Answer::create([
'question_id' => $request->participant_question_id[$i],
'participant_id' => $participants[$i]->id,
'answer' => $request->participant_question[$i],
]);
}
return response()->json([
'success' => true,
'message' => 'success'
], 200);
}
else {
$messages = [
'participant_question.*.required' => 'The participant is required'
];
foreach ($request->participant_question_required as $key => $value) {
$rule = 'string|max:255'; // I think string should come before max
//dd($value);
// if this was required, ie 1, prepend "required|" to the rule
if ($value) {
$rule = 'required|' . $rule;
}
// add the individual rule for this array key to the $rules array
$rules["participant_question.{$key}"] = $rule;
}
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->passes()) {
$registration = Registration::create([
'congress_id' => $id,
'main_participant_id' => $user->id,
'status' => 'C',
]);
$participants = [];
for ($i = 0; $i < count($request->participant_name); $i++)
$participants[] = Participant::create([
'name' => '',
'surname' => '',
'registration_id' => $registration->id,
'ticket_type_id' => $request->rtypes[$i]
]);
for ($i = 0; $i < count($request->participant_question); $i++)
$answer = Answer::create([
'question_id' => $request->participant_question_id[$i],
'participant_id' => $participants[$i]->id,
'answer' => $request->participant_question[$i],
]);
}
return response()->json([
'success' => true,
'message' => 'success'
], 200);
}
}
Соответствующие модели к вопросу:
class Congress extends Model
{
// A conference has many ticket types
public function ticketTypes(){
return $this->hasMany('App\TicketType', 'congress_id');
}
public function registrations(){
return $this->hasMany('App\Registration', 'congress_id');
}
}
// RegistrationModel
class Registration extends Model
{
// a registration has one user that do the registration (main_participant_id)
public function customer(){
return $this->belongsTo('App\User');
}
public function congress(){
return $this->belongsTo('App\Congress');
}
}
class TicketType extends Model
{
public function congress(){
return $this->belongsTo('App\Congress');
}
}
class Question extends Model
{
public function registration_type(){
return $this->belongsToMany('App\RegistrationType', 'ticket_type_questions')
->withPivot('required');
}
}
class Answer extends Model
{
public function question(){
return $this->belongsTo('Question');
}
public function participant(){
return $this->belongsTo('Participant');
}
}
Диаграмма, которая показывает некоторые проблемы с кодом, который у меня есть на данный момент, это код в вопросе:
Как метод $request->participant_question_required генерирует свои данные? Если в одном экземпляре это массив, а в другом - false или null, разве вам не нужно защищать цикл foreach от попыток обработки несуществующих данных?
Если при регистрации есть пользовательские вопросы «@foreach ($ selectedType ['questions'] as $ customQuestion)», тогда в storeUserInfo существует «$ request-> members_question_required», в противном случае - null, что приводит к ошибке недопустимого аргумента. Но с "if (isset ($ request-> members_question_required)) {", а затем весь код внутри этого, например, этот, если у конгресса нет связанных настраиваемых вопросов, тогда не появляется никаких ошибок, но записи не вставляются в регистрации и таблица участников.
А в форме регистрации есть "<input type = " hidden "name = " members_question_required [] ". 0 или 1, 1 означает обязательный, false означает, что не требуется.
И «обязательные» поля - это поле сводной таблицы ticket_type_questions, которое имеет такую структуру: id, ticket_type_id, question_id, required.






Прежде всего используйте select * from TABLENAME, а затем используйте функцию COUNT либо в запросе, либо используйте функцию PHP Count в файле лезвия laravel
затем выполните свой код ..
на пилке
@if (count($records)>0){
// Your Code
}
Если вы хотите сохранить более одного ticket_type для участника, вам нужно будет использовать сводную таблицу. Сводная таблица - это таблица, которая содержит только идентификаторы и связывает данные во многих отношениях.
например
participants_ticket_type table
id ticket_type_id participant_id
1 1 2
2 2 2
Обратите внимание, как у участника 2 есть ticket_types 1 и 2? Это отношения "многие ко многим".
Laravel обрабатывает эти отношения за вас, и вы можете найти это в их документации. https://laravel.com/docs/5.6/eloquent-relationships#many-to-many
Обычно, если вы обнаруживаете, что храните более 1 идентификатора в столбце, связь «многие ко многим» решает эту проблему.
Спасибо, но у меня уже есть эти отношения: 1 to many between Congress and Registration, 1 to many between Registration and Participant, 1 to many between TicketType and Participant.
И структура этих таблиц такая: Congress: id, name, ...; TicketType: id, congress_id, name,..; Participants: id, registration_id, ticket_type_id, name, email; Registration:id, status, congress_id.
Невозможно сохранить в таблице участников? Поскольку наличие многих ко многим между участником и типом билета не кажется правильным, потому что участник связан только с одним типом билета, но тип билета может иметь несколько участников.
Возможно, однако, вам нужно будет написать хакерский код, чтобы заставить его работать эффективно. Насколько я понимаю, вы говорите: «У участника может быть несколько типов билетов». Это заставило бы меня сказать, что вам нужна сводная таблица между member и ticket_type.
Спасибо, но участник не может иметь несколько типов билетов, участник связан только с одним типом билетов. Например, пользователь Джон может регистрироваться на конгрессе, регистрироваться с двумя участниками, самим собой и другими участниками. И для этого конгресса существует два типа билетов «tt1» и «tt2», и Джон регистрирует его в типе билета «tt1», а другой коллега - в типе билета «tt2».
Это только одна регистрация с 2 участниками, участник Джон, который является основным участником, потому что регистрация связана с типом билета «tt1», а его коллега связан с типом билета «tt2».
Хорошо, чтобы прояснить, вы говорите: «Человек, который зарегистрировался на конгрессе, может добавлять людей к регистрации»? Если это так, вы правы в том, что написали в своем вопросе, где вы просто добавляете несколько человек в таблицу участников с нулями. Единственная проблема, с которой я столкнулся, заключается в том, что если тот же пользователь захочет создать еще один registration, некоторые из ваших данных будут дублироваться, и для решения этой проблемы вам понадобится сводная таблица, аналогичная ответу. Я недостаточно хорошо знаю ваш бизнес-кейс, чтобы сказать вам, стоит ли вам об этом беспокоиться :).
В идеале у вас должен быть создатель регистрации и участники за разными столами. Это позволит одному и тому же пользователю создать несколько регистраций. например Регистрация содержит creator_id, а затем сводную таблицу между registration и participants.
Спасибо, создатель регистрации и участники находятся в разных таблицах. Создатель регистрации находится в таблице регистрации со столбцом «main_participant_id», а участники находятся в таблице участников со столбцами (id, registration_id, ticket_type_id, имя и фамилия).
Пользователь может выполнить регистрацию в конференции, а затем выполнить еще одну регистрацию в той же конференции. Но это не должно быть проблемой, потому что у каждой регистрации другой идентификатор. Также пользователь может при одной регистрации на конгресс зарегистрировать много участников, но у каждого участника будет свой идентификатор, так что это тоже не должно быть проблемой, не так ли?
Я не понимаю, зачем нужна сводная таблица, потому что сводная таблица предназначена только для многих, верно? Но я не понимаю, что нужно многим многим в этом контексте.
Это чисто для многоразового использования. Я недостаточно хорошо знаю ваше экономическое обоснование, чтобы знать, что может произойти, например что, если вы хотите, чтобы участник участвовал в нескольких регистрациях. Я думаю, что на данный момент вы правы, что в вашей таблице участников есть несколько строк для каждой регистрации. Возможно, добавьте столбец is_creator_attending в регистрационную таблицу, чтобы вам не приходилось снова помещать их в таблицу участников.
Спасибо, пользователь может выполнить несколько регистраций на конгрессе, если он хочет, поэтому в таблице регистраций может быть несколько "congress_id" и "main_participant_id" с одинаковыми идентификаторами, потому что пользователь, который выполняет регистрацию, может выполнять несколько регистраций на одном и том же конгрессе. , есть какая-то проблема?
И участники не являются зарегистрированными пользователями в системе, а просто имена и фамилии, которые нужно связать с типом тикета. В случае, если all_participants равно "0", необходимо только знать, какие типы билетов были зарегистрированы, и main_participant_id.
Я дополняю вопрос моделями, чтобы лучше объяснить контекст.
Пользователь, который выполняет регистрацию, то есть аутентифицированный пользователь, должен храниться в таблице регистрации только с main_participant_id, в таблице участников не должно храниться ничего о пользователе, который выполняет регистрацию. Но пользователь, который выполняет регистрацию, может быть участником, поэтому в таблице участников можно указать имя и фамилию аутентифицированного пользователя, который выполнил регистрацию, если он является участником конгресса.
Хорошо, так что у вас много всего происходит, и на самом деле трудно вытащить свой «вопрос». Я бы порекомендовал сделать большой шаг назад и выяснить, в чем именно заключаются ваши проблемы, и разбить их на более управляемые части.
Я вижу две вещи
1.- Форма ничего не отправляет, когда $ allParticipants == 0, может быть, что-то вроде:
<form method = "post" id = "step1form" action = "">
{{csrf_field()}}
@if (!is_null($allParticipants) && is_int($allParticipants))
@if ($allParticipants == 1)
<p>Please fill in all fields. Your tickets will be sent to
p{{ (\Auth::check()) ? Auth::user()->email : old('email')}}.</p>
@else
<p>Its not necessary aditional info. Your tickets will be sent to {{ (\Auth::check()) ? Auth::user()->email : old('email')}}.</p>
@endif
@foreach($selectedTypes as $selectedType)
@foreach(range(1,$selectedType['quantity']) as $test)
<h6>Participant - 1 - {{$test}}</h6>
<div class = "form-check">
<input class = "form-check-input" type = "radio" name = "payment_method" value = "referencias">
<label class = "form-check-label d-flex align-items-center" for = "exampleRadios1">
<span class = "mr-auto">Fill the following fields with the authenticated user information.</span>
</label>
</div>
@if ($allParticipants == 1)
<div class = "form-group font-size-sm">
<label for = "participant_name" class = "text-gray">Name</label>
<input type = "text" name = "participant_name[]" required class = "form-control" value = "">
</div>
<div class = "form-group font-size-sm">
<label for = "participant_surname" class = "text-gray">Surname</label>
<input type = "text" required class = "form-control" name = "participant_surname[]" value = "">
</div>
@foreach($selectedType['questions'] as $customQuestion)
<div class = "form-group">
<label for = "participant_question">{{$customQuestion->question}}</label>
<input type = "text"
@if ($customQuestion->pivot->required == "1") required @endif
class = "form-control" name = "participant_question[]">
<input type = "hidden" name = "participant_question_required[]"
value = "{{ $customQuestion->pivot->required }}">
<input type = "hidden" value = "{{ $customQuestion->id }}" name = "participant_question_id[]"/>
</div>
@endforeach
@else
<input type = "hidden" value = "foo" name = "participant_name[]"/>
<input type = "hidden" value = "bar" name = "participant_surname[]"/>
@endif
<input type = "hidden" name = "ttypes[]" value = "{{ $selectedType['id'] }}"/>
@endforeach
@if ($allParticipants == 0)
@foreach($selectedType['questions'] as $customQuestion)
<div class = "form-group">
<label for = "participant_question">{{$customQuestion->question}}</label>
<input type = "text"
@if ($customQuestion->pivot->required == "1") required @endif
class = "form-control" name = "participant_question[]">
<input type = "hidden" name = "participant_question_required[]"
value = "{{ $customQuestion->pivot->required }}">
<input type = "hidden" value = "{{ $customQuestion->id }}" name = "participant_question_id[]"/>
</div>
@endforeach
@endif
@endforeach
@endif
<input type = "submit" href = "#step2"
id = "goToStep2Free" class = "btn btn-primary btn float-right next-step" value = "Go to step 2"/>
</form>
2.- Вопросы, похоже, зависят от типов заявок и являются дополнительными, функция должна это учитывать.
public function StoreUserInfo(Request $request, $id, $slug = null, Validator $validator){
$allParticipants = Congress::where('id', $id)->first()->all_participants;
$user = Auth::user();
$rules = [];
$messages = [];
if (isset($request->participant_question_required)) {
$messages = [
'participant_question.*.required' => 'The participant is required'
];
foreach ($request->participant_question_required as $key => $value) {
$rule = 'string|max:255'; // I think string should come before max
//dd($value);
// if this was required, ie 1, prepend "required|" to the rule
if ($value) {
$rule = 'required|' . $rule;
}
// add the individual rule for this array key to the $rules array
$rules["participant_question.{$key}"] = $rule;
}
}
if ($allParticipants){
$rules = [
'participant_name.*' => 'required|max:255|string',
'participant_surname.*' => 'required|max:255|string',
];
}
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->passes()) {
$registration = Registration::create([
'congress_id' => $id,
'main_participant_id' => $user->id,
'status' => 'C',
]);
$participants = [];
for ($i = 0; $i < count($request->participant_name); $i++) {
$name = ($allParticipants) ? $request->participant_name[$i] : '';
$surname = ($allParticipants) ? $request->participant_surname[$i] : '';
$participants[] = Participant::create([
'name' => $name,
'surname' => $surname,
'registration_id' => $registration->id,
'ticket_type_id' => $request->rtypes[$i]
]);
}
if (isset($request->participant_question))
for ($i = 0; $i < count($request->participant_question); $i++)
$answer = Answer::create([
'question_id' => $request->participant_question_id[$i],
'participant_id' => $participants[$i]->id,
'answer' => $request->participant_question[$i],
]);
}
return response()->json([
'success' => true,
'message' => 'success'
], 200);
}
Надеюсь, что это работает! С Уважением
Спасибо, я тестирую первый, но когда all_participants имеет значение «0» в регистрационной форме, не появляется никакого сообщения, это не появляется »<p> Это необязательная дополнительная информация. Ваши билеты будут отправлены на адрес {{(\ Auth :: check ( ))? Auth :: user () -> email: old ('email')}}. </p> ". Вы знаете, почему?
А также зачем нужен "@else <input type = " hidden "value = " foo "name = " имя_участника [] "/> <input type = " hidden "value = " bar "name = " имя_участника [] "/> @endif "?
empty ($ allParticipants) истинно, когда $ allParticipants == 0, поэтому первое условие должно проверять @if (! is_null($allParticipants) && is_int($allParticipants)) { . Я добавил оба hiddens, потому что текстовое поле не будет отправлено, когда $ allParticipants == 0, поэтому count($request->participant_name) не будет работать в цикле for .
Спасибо, но по-прежнему не появляется "<p> Это необязательная дополнительная информация. Ваши билеты будут отправлены на {{(\ Auth :: check ())? Auth :: user () -> email: old ('email') }}. </p> ".
<form method = "post" id = "step1form" action = ""> {{csrf_field ()}} {{$ allParticipants}} показывает "0".
С помощью «@if (! Is_null ($ allParticipants) && is_int ($ allParticipants))» отображается сообщение.
Но если пользователь выбрал 2 билета, и эти билеты связаны с одним или несколькими настраиваемыми вопросами, если all_participants равно «0», пользовательский вопрос должен отображаться только один раз, чтобы пользователь, выполняющий регистрацию, мог ответить. Поскольку «all_participants» как «0» означает, что это необходимо только для сбора информации от пользователя, который выполняет регистрацию. Но это не работает, если пользователь выбирает 2 билета, с которыми связаны пользовательские вопросы, появляется пользовательский вопрос для каждого билета (для каждого участника), а не просто появляется пользовательский вопрос один раз для ответа пользователя auth.
Эта форма очень быстро становится уродливой, она должна быть сгенерирована более модульным способом, уже слишком много случаев.
Спасибо, но по-прежнему появляются два поля ввода для пользовательских вопросов, когда all_participants равно 0, например: Участник - 1 - 1 Телефон? Участник - 1 - 1 Телефон? Но должно появиться только поле ввода для пользователя, который выполняет регистрацию (аутентифицированный пользователь), чтобы войти в свой телефон.
Альтернативный вариант 1: возможно, заголовок участника должен находиться за пределами 2 @foreach, вы не можете получить $selectedType['questions'] за пределами первого цикла. Проблема в том, что вы получаете только один заголовок, без различия между участниками. Альтернативный вариант 2: не следует переключаться между типами билетов ... так как у каждого может быть свой вопрос, даже если allParticipants == 0 ... или тот же самый, что и в вашем примере.
Спасибо, но если allParticipant равен 0, то в storeUserInfo () можно использовать идентификатор пользователя, который выполняет регистрацию, аутентифицированного пользователя с $ user-> id, например «'member_id' => $ user> id,» нет? Но в регистрационной форме не знаю, как она должна работать исправно.
Вы знаете, как можно организовать регистрационную форму для реализации сценариев?
Столбец JSON для любой дополнительной информации.