Реляционная база данных Laravel - объединение 4 таблиц - PullRequest
0 голосов
/ 11 сентября 2018

Я относительно новичок в реляционных базах данных и пытаюсь найти способ получить ответы на опрос за этот день от конкретного пользователя. Моя конечная цель - проверить, насколько далеко находится пользователь в опросе или пользователь прошел этот опрос. Спасибо за вашу помощь.

У меня есть таблица участников, таблица опросов, таблица вопросов для опросов и таблица ответов на опрос.

  • У каждого участника много опросов

  • Каждый участник имеет много ответов на вопросы опроса (2)

  • В каждом опросе много вопросов

  • На каждый вопрос есть один ответ

Я не уверен, стоит ли мне устанавливать отношения hasManyThrough. На данный момент с моими моделями я могу найти участника, затем найти соответствующий опрос, а затем собрать вопросы из этого опроса. Это когда цепь разрывается, и я не могу использовать вопросы, которые я извлекаю из опроса, и найти их ответы, используя мою модель "SurveyResponse". Может ли кто-нибудь помочь мне выяснить, правильны ли структура / отношения моей БД?

Мой контроллер (я могу попасть туда, где он повторяет тело $ question->, но не могу проверить ответы на вопрос, используя что-то вроде $ question-> response () -> get):

public function findResponses(Request $request)
{
    $participant_id = '1234';
    $surveyDate = new Carbon();
    $surveyDate = $surveyDate->toDateString();
    $participant = Participant::where('user_id', $participant_id)->first();

    // check if participant daily survey is initiated
    $surveyStarted = $participant->dailySurveyInitiated;

    if($surveyStarted)
    {
        $activeSurveyParticipant = Participant::where('user_id', $participant_id)->first();
        // find survey for that date corresponding to that user
        $activeSurvey = Survey::where('survey_Date', $surveyDate)->where('participant_id', $participant_id)->first();

        $surveyID = $activeSurvey->id;
        // gather the questions
        $activeSurveyQuestions = $activeSurvey->SurveyQuestions()->where('survey_id', '=', $surveyID)->get();
        // check to see what questions have been answered

        foreach($activeSurveyQuestions as $question)
        {
            echo $question->body;
            echo '<br>';

            // really want to gather the responses to each 
            // question based off the participant_id...
            // something like
            // $currentQ = $question->SurveyResponse::where('response', '!=', null)->get();
            // echo $currentQ->response;

        }

    }
    else
    {

    }
}

Модель моего участника:

class Participant extends Model
{
    protected $table = 'participants';
    protected $primaryKey = "user_id";

    public function surveys()
    {
        return $this->hasMany('App\Survey', 'participant_id', 'user_id');
    }

    public function surveyQuestionResponses()
    {
        return $this->hasMany('App\Survey', 'App\SurveyQuestionResponses');
    }

    public function surveyResponses()
    {
        return $this->hasManyThrough('App\SurveyResponse', 'App\SurveyQuestion');
    }
}

Таблица участников:

class CreateParticipantsTable extends Migration
{
protected $primaryKey = 'user_id';
protected $incrementing = false;

public function up()
{
    Schema::create('participants', function (Blueprint $table) 
    {
        $table->engine = 'InnoDB';
        $table->string('user_id')->unique();
        $table->boolean('subscribed')->default(0);
        $table->boolean('dailySurveyInitiated')->default(0)->nullable();
        $table->integer('dailySurveyCompleted')->default(0)->nullable();

        $table->boolean('studyCompleted')->default(0);

        $table->timestamps();
    });
}

Моя модель опроса:

class Survey extends Model
{
    protected $table = 'surveys';

    public function SurveyQuestions()
    {
        return $this->hasMany('App\SurveyQuestion');
    }
    // Participant
    public function participant()
    {
        return $this->belongsToMany('App\Participant', 'user_id', 'participant_id');
    }
}

Моя таблица опросов:

class CreateSurveysTable extends Migration
{
    public function up()
    {
        Schema::create('surveys', function (Blueprint $table) 
        {
            $table->engine = 'InnoDB';
            $table->increments('id');
            $table->string('participant_id')->nullable();
            $table->string('survey_date')->nullable();
            $table->boolean('completed')->nullable()->default(0);
            $table->timestamps();
        });

        Schema::table('surveys', function($table) {
            $table->foreign('participant_id')->references('user_id')->on('participants');
        });
    }
}

My SurveyQuestions Модель:

class SurveyQuestion extends Model
{
    protected $table = 'survey_questions';

    public function survey()
    {
        return $this->belongsTo('App\Survey', 'survey_id');
    }

    public function participant()
    {
        return $this->belongsTo('App\Participant', 'participant_id');
    }

    public function responses()
    {
        return $this->hasMany('App\SurveyResponse', 'question_id');
    }
}

Моя таблица опросов:

class CreateSurveyQuestionsTable extends Migration
{
    public function up()
    {
        Schema::create('survey_questions', function (Blueprint $table) 
        {
            $table->engine = 'InnoDB';
            $table->increments('id');
            $table->string('body')->nullable();
            $table->enum('type', ['numeric', 'image'])->nullable();
            $table->integer('survey_id')->nullable();
            $table->timestamps();
        });

        Schema::table('survey_questions', function($table) {
            $table->foreign('survey_id')->references('id')->on('surveys');
        });
    }
}

Модель моего опроса: отклик

class SurveyResponse extends Model
{
    protected $table = 'survey_responses';

    public function question()
    {
        return $this->belongsTo('App\SurveyQuestion');
    }
    public function participant()
    {
        return $this->belongsTo('App\Participant');
    }
}

Моя таблица ответов на опрос:

class CreateSurveyResponsesTable extends Migration
{
    public function up()
    {
        Schema::create('survey_responses', function (Blueprint $table) 
        {
            $table->engine = 'InnoDB';
            $table->increments('id');
            $table->string('participant_id')->nullable();
            $table->integer('question_id')->nullable();
            $table->integer('survey_id')->nullable();
            $table->string('session_sid')->nullable();

            $table->text('response')->nullable();
            $table->enum('type', ['numeric', 'image'])->nullable();

            $table->string('mediaSID')->index()->nullable();
            $table->string('messageSID')->index()->nullable();
            $table->string('mediaURL')->index()->nullable();
            $table->binary('media')->nullable();
            $table->string('filename')->index()->nullable();
            $table->string('MIMEType')->nullable();

            $table->timestamps();
        });

        Schema::table('survey_responses', function($table) {
            $table->foreign('participant_id')->references('user_id')->on('participants');
            $table->foreign('question_id')->references('id')->on('survey_questions');
            $table->foreign('survey_id')->references('survey_id')->on('survey_questions');
        });
    }
}
...