База данных правильно структурирована для обработки сценария, когда «all_participant» равен «0»? - PullRequest
0 голосов
/ 02 мая 2018

У меня есть контекст, в котором у меня есть форма для регистрации пользователя на конгрессе. И есть два разных контекста: когда «all_participant» равно «1» и когда «all_participant» равно «0» в таблице конгрессов.

Когда all_participant равен "1":

  • если «all_participant» равно «1» в таблице конгрессов, и пользователь выполняет регистрацию в некоторых типах заявок, и ни к одному типу заявки не привязаны пользовательские вопросы, в форме регистрации необходимо собрать только имя и фамилию о каждый участник, которого регистрирует пользователь
  • если «all_participant» равен «1» и пользователь выполняет регистрацию в некоторых типах заявок, с которыми связаны пользовательские вопросы, необходимо собрать ответ на эти пользовательские вопросы для каждого участника, который регистрируется в тех типах заявок, которые имеют что пользовательские вопросы

Лучше, когда «all_participants» равен 1 в таблице конгрессов:

enter image description here

Когда пользователь нажимает «Перейти к шагу 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:

enter image description here

Отношения, имеющие отношение к вопросу:

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);
    }

1 Ответ

0 голосов
/ 10 мая 2018

Мне кажется, что ваша таблица ответов нуждается в понимании того, в каком качестве действовал ответчик. Пожалуйста, смотрите мой комментарий, как бы тщательно вы ни описывали ситуацию, я все еще немного неясен в некоторых вещах. Но на данный момент я догадываюсь, что ваша структура данных неправильно истолковывает идею «главного» или «участника» как уникального человека, в отличие от роли, которую может нести данный человек.

Я думаю, что вам нужны таблицы, которые выглядят так:

Table        | Relationship        | Table
-------------------------------------------------
Users        | one-to-many         | Participants
Groups       | one-to-many         | Participants
Participants | many-to-many        | Roles
             | (Participant_Roles) |
Answers      | one-to-one          | Participant_Roles (replace your Answers.participant_id with this)
Answers      | one-to-one          | Question
Tickets      | many-to-many        | Question
             | (Ticket_Questions)  |

Ваши роли могут быть такими, как "основной" и "участник". Таким образом, хитрость здесь заключается в том, чтобы дать вашему ответу ссылку не только на человека, но и на то, в каком качестве они действовали в то время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...