У меня есть контекст, в котором у меня есть форма для регистрации пользователя на конгрессе. И есть два разных контекста: когда «all_participant» равно «1» и когда «all_participant» равно «0» в таблице конгрессов.
Когда all_participant равен "1":
- если «all_participant» равно «1» в таблице конгрессов, и пользователь выполняет регистрацию в некоторых типах заявок, и ни к одному типу заявки не привязаны пользовательские вопросы, в форме регистрации необходимо собрать только имя и фамилию о каждый участник, которого регистрирует пользователь
- если «all_participant» равен «1» и пользователь выполняет регистрацию в некоторых типах заявок, с которыми связаны пользовательские вопросы, необходимо собрать ответ на эти пользовательские вопросы для каждого участника, который регистрируется в тех типах заявок, которые имеют что пользовательские вопросы
Лучше, когда «all_participants» равен 1 в таблице конгрессов:
Когда пользователь нажимает «Перейти к шагу 2» в форме регистрации, в таблицу «Регистрации» вставляется запись, запись для каждого участника в таблице «Участники» и записи в таблице ответов относительно ответов на пользовательские вопросы. Таким образом, база данных остается такой же, как показано ниже, когда пользователь нажимает «Перейти к шагу 2» в форме регистрации:
Registrations table:
id status congress_id main_participant_id
7 C 1 1
Participants table:
id registration_id ticket_type_id name surname
12 7 1 John W
13 7 2 Jake Y
Answers table:
id participant_id question_id answer
2 12 1 0002
3 13 1 0003
Когда all_participant равен "0":
Я сомневаюсь, как хранить информацию, когда «all_participants» равно «0». Таким образом, пользователь Джон, который выполняет регистрацию, выбрал 2 заявки, одну заявку типа заявки «tt1» и другую заявку типа «tt2», и заявку типа «tt1» имеет 1 пользовательский вопрос, связанный, и теперь «all_participants» «0», что означает, что нет необходимости собирать информацию о каждом участнике, необходимо только использовать информацию о пользователе авторизации для регистрации.
Но если существуют пользовательские вопросы, необходимо, чтобы пользователь auth (пользователь, который выполняет регистрацию) отвечал на эти пользовательские вопросы, но если "all_participant" равен "0", только пользователь, который выполняет регистрацию, должен ответить на эти вопросы. вопросы, например, если пользователь выбрал два тикета и у одного или нескольких связанных с ним пользовательских вопросов в форме регистрации, кроме того, что пользователь выбрал 2 тикета в форме регистрации, он появится только один раз, а не дважды потому что только для пользователя, который делает регистрацию, чтобы ответить (потому что "all_participants" равен "0"). Таким образом, в этом случае, когда пользователь нажимает кнопку «Перейти к шагу 2» в форме регистрации, база данных остается такой:
Registrations table:
id status congress_id main_participant_id
10 C 1 1
Participants table: (name and surname and blank because when "all_participant" is "0" is not necessary to collect name and surname of each participant)
id registration_id ticket_type_id name surname
18 10 1
19 10 2
Answers table:
id participant_id question_id answer
4 18 1 0002
Сомнение:
Я сомневаюсь, если вы знаете, правильно ли это структурировано, потому что кажется, что невозможно определить, к какому пользователю относятся ответы.
, когда"all_participant" равно "0", и есть пользовательские вопросы в 1 или более типах заявок, выбранных пользователем. Поскольку таблица ansers имеет только member_id, который в данном случае равен «18», но пользователь, который выполнил регистрацию, является пользователем в таблице users с идентификатором «1».
main_participant_id в таблице регистрации - это идентификатор пользователя в таблице пользователей, который выполнил регистрацию, который позволяет узнать, какой пользователь сделал регистрацию.
Чтобы лучше проиллюстрировать 3 возможных сценария, когда «all_participant» равен 0:
Отношения, имеющие отношение к вопросу:
1 to many between Congresses and Registrations
1 to many between Congresses and TicketTypes
1 to many between Registrations and Participants
1 to many between TicketTypes and Participants
1 to many between Participants and Answers
1 to many between Questions and Answers
Many to Many between TicketTypes and Questions
1 to many between Congresses and Questions
Соответствующие модели на вопрос:
// Congress model
class Congress extends Model
{
// A conference has one creator
public function creator(){
return $this->belongsTo('App\User', 'user_id');
}
public function ticketTypes(){
return $this->hasMany('App\TicketType', 'congress_id');
}
public function registrations(){
return $this->hasMany('App\Registration', 'congress_id');
}
}
// User model
class User extends Authenticatable
{
public function congresses(){
return $this->hasMany('App\Congress', 'user_id');
}
// A user can register in many conferences
public function registrations(){
return $this->hasMany('App\Registration','main_participant_id');
}
}
// Registration model
class Registration extends Model
{
// a registration has one user that do the registration
public function customer(){
return $this->belongsTo('App\User');
}
// a registration can have many participants
public function participants(){
return $this->hasMany('App\Participant');
}
public function congress(){
return $this->belongsTo('App\Congress');
}
}
// Participant Model
class Participant extends Model
{
// a participant belongs to a registration
public function registration(){
return $this->belongsTo('App\Registration');
}
}
// Ticket Type model
class TicketType extends Model
{
public function congress(){
return $this->belongsTo('App\Congress');
}
public function questions(){
return $this->belongsToMany('App\Question', 'ticket_type_questions')->withPivot(['required']);;
}
}
// Question model
class Question extends Model
{
public function ticket_type(){
return $this->belongsToMany('App\TicketType', 'ticket_type_questions')
->withPivot('required');
}
}
// Answer model
class Answer extends Model
{
public function question(){
return $this->belongsTo('Question');
}
public function participant(){
return $this->belongsTo('Participant');
}
}
// TicketTypeQuestion model
class RegistrationTypeQuestion extends Model
{
}
Чтобы зарегистрировать пользователя и других участников, которых он может зарегистрировать, в обоих сценариях: "all_participant" как "1" и "all_participant" как "0", у меня есть метод register () на данный момент, например:
public function register(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' => 'Fill all mandatory fields',
'participant_name.*.required' => 'Fill all name fields.',
'participant_surname.*.required' => 'Fill all surname fields.',
];
foreach ($request->participant_question_required as $key => $value) {
$rule = 'string|max:255';
if ($value) {
$rule = 'required|' . $rule;
}
$rules["participant_question.{$key}"] = $rule;
}
}
if($allParticipants){
$rules["participant_name.*"] = 'required|max:255|string';
$rules["participant_surname.*"] = 'required|max:255|string';
}
$validator = Validator::make($request->all(), $rules, $messages);
$errors = $validator->errors();
$errors = json_decode($errors);
if($validator->fails()) {
return response()->json([
'success' => false,
'errors' => $errors
], 422);
}
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->ttypes[$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);
}