Как связать таблицу отношений в laravel, я нашел в stackoverflow, но не полностью понял

Следует моей структуре БД:

surveys 
->id 
->name 
->version 

answers 
->id 
 ->user_id 
 ->question_survey_id 
 ->content

questions 
->id 
->type 
->title 

 question_survey 
 ->id 
 ->question_id 
 ->survey_id

  users 
  ->id 
  ->name 

Это мои модели

class Survey extends Model
{
  public function questions(){
      return $this->belongsToMany(Question::class);
   }
}

class Question extends Model
{   
   public function surveys(){
        return $this->belongsToMany(Survey::class);
   }
}

// in User model
public function answers(){
   return $this->hasMany(Answer::class);
}

// in Answer model
public function users(){
    return $this->belongsTo(User::class,'user_id');
}

Как подключить таблицу отвечать вопросами через ключ question_survey_id? Таблица ответов к таблице question_survey - это отношения один-к-одному ... :)

Если вопрос неясен, не голосуйте против, а спросите меня, спасибо

вопросы о взаимоотношениях и опросы находятся в сводной таблице question_survey, он работает, также как пользователи и ответы, он тоже работает, но как связать пользователей с вопросами с помощью question_survey_id

ammar 03.08.2018 05:15

У вас уже есть настроенные модели?

alariva 03.08.2018 05:29
question_survey_id принадлежит к какому столу? как можно повторить id в таблице question_survey. лучше добавить свою модель в вопрос
rkj 03.08.2018 05:31

@alariva, хорошо, я добавляю свои модели, это отношения

ammar 03.08.2018 05:36

@rkj извините, я исправил это новое обновление

ammar 03.08.2018 05:39

у вас есть модель для question_survey?

rkj 03.08.2018 05:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
6
78
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Поскольку ваши ключи БД настроены для предположения Laravel, вам необходимо указать имя ключа с дополнительными параметрами. См. Ссылку здесь.

class Question extends Model
{
   // ...
   public function answer(){
        return $this->hasOne(Answer::class, 'question_survey_id');
   }
   // ...
}

class Answer extends Model
{
   // ...
   public function question(){
        return $this->belongsTo(Question::class, 'question_survey_id');
   }
   // ...
}

кажется, что вопросы могут получить ответ, но ответ не может получить вопросы, которые я пробую в tinker Вопрос :: find (1) -> ответ работает, а Answer :: find (1) -> вопрос дает ошибку

ammar 03.08.2018 06:57

общедоступная функция question () {return $ this-> ownTo (Question :: class, 'question_survey_id'); } я удаляю идентификатор, и он отлично работает

ammar 03.08.2018 06:58

Круто, подредактирую ответ. Не стесняйтесь отмечать как решенное.

alariva 03.08.2018 06:59

Как насчет того, чтобы по ответам я хотел получать опросы, это возможно? пример ответа :: find (1) -> опросы

ammar 03.08.2018 06:59

@ammar Это новый вопрос. К счастью, у вас есть очень хорошее объяснение в этот связанный вопрос. В основном проверьте отношения hasManyThrough.

alariva 03.08.2018 07:03

Хорошая попытка, брат, ты классный, но я нашел другое решение, спасибо, что провел время со мной, люблю тебя :)

ammar 03.08.2018 18:59
Ответ принят как подходящий

Создайте модель для таблицы question_survey с именем QuestionSurvey, а затем добавьте еще одно отношение в модель Question, как это

Модель вопроса

public function questionSurveys(){
    return $this->hasMany(QuestionSurvey::class,'question_id');
}

Вопрос Модель опроса

protected $table = "question_survey";

public function answer(){
    return $this->hasOne(Answer::class,'question_survey_id');
}

Теперь вы можете использовать это отношение для получения

$questions = Question::with('questionSurveys.answer')->get();

foreach($questions as $question){
   foreach($question->questionSurveys as $questionSurvey) {
      echo "Answer = ". $questionSurvey->answer->content;
   }
}

значит поставить другую таблицу между ответом и вопросами?

ammar 03.08.2018 06:13

нет, вам просто нужно создать модель для стола question_survey. У вас уже есть эта таблица

rkj 03.08.2018 06:14

Я думаю, вам не нужен survey_id в таблице вопросов

rkj 03.08.2018 06:43

Я пробую этот подход, но мастер не видит, что класс QuestionSurvey :: find (1) в основном будет показывать идентификатор в question_survey, но он не

ammar 03.08.2018 07:17

вы создали модель QuestionSurvey?

rkj 03.08.2018 07:19

да создаю и ставлю защищенный $ table = "question_survey"

ammar 03.08.2018 09:36

однако у него есть другие ошибки, попробуйте использовать другой подход

ammar 03.08.2018 10:48

@ammar принятый ответ неверен, потому что question_survey_id принадлежит первичному ключу таблицы question_survey, тогда как он может иметь отношение к таблице ответов с этим полем

rkj 03.08.2018 11:38

Demonowh я пробую его решение, оно работает, но немного займет больше места, верно?

ammar 03.08.2018 12:11

ты пробовал мое решение? Это с вашей существующей структурой таблицы, за исключением удаления survey_id из таблицы вопросов

rkj 03.08.2018 12:14

он работает отлично, но я изменил код, чтобы соответствовать отношениям

ammar 03.08.2018 18:59

Лучший подход к отношениям

  1. Опрос принадлежит многим Вопросам
  2. Вопрос принадлежитToMany Опрос

this way you won't repeat questions for each survey in case you have two same questions with two different surveys.

  1. У вопроса есть много ответов, где survey_id = Question-> Survey
  2. Ответ принадлежит пользователю

Модели

Опрос

public function questions() {
    return $this->belongsToMany(Question::class, 'survey_questions', 'survey_id', 'question_id');
}

Вопрос

public function survey() {
    return $this->belongsToMany(Survey::class, 'survey_questions', 'question_id', 'survey_id');
}

public function answers() {
    return $this->hasMany(Answer::class)->where('survey_id', $this->survey->id);
}

Отвечать

public function author() {
    return $this->belongsTo(User::class, 'user_id');
}

Базы данных

tbl_surveys

  • я бы
  • Survey_name

tbl_questions

  • я бы
  • вопрос

tbl_survey_questions

  • я бы
  • Survey_id
  • question_id

tbl_answers

  • я бы
  • ID пользователя
  • отвечать
  • question_id
  • Survey_id

tbl_users

  • я бы
  • название

Надеюсь, ты знаешь, что делать дальше ...

Я попробую этот подход, дам вам знать как можно скорее.

ammar 03.08.2018 07:17

вопрос hasMany ответ, но с предложением where .. так что он получит ответы только из одного опроса ..

Demonyowh 03.08.2018 08:30

этот подход работает хорошо, но он будет использовать некоторое пространство, потому что он будет дублировать, хотя хорошие решения, кстати,

ammar 03.08.2018 12:21

Другие вопросы по теме