Следует моей структуре БД:
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_id принадлежит к какому столу? как можно повторить id в таблице question_survey. лучше добавить свою модель в вопрос
@alariva, хорошо, я добавляю свои модели, это отношения
@rkj извините, я исправил это новое обновление
у вас есть модель для question_survey?






Поскольку ваши ключи БД настроены для предположения 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) -> вопрос дает ошибку
общедоступная функция question () {return $ this-> ownTo (Question :: class, 'question_survey_id'); } я удаляю идентификатор, и он отлично работает
Круто, подредактирую ответ. Не стесняйтесь отмечать как решенное.
Как насчет того, чтобы по ответам я хотел получать опросы, это возможно? пример ответа :: find (1) -> опросы
@ammar Это новый вопрос. К счастью, у вас есть очень хорошее объяснение в этот связанный вопрос. В основном проверьте отношения hasManyThrough.
Хорошая попытка, брат, ты классный, но я нашел другое решение, спасибо, что провел время со мной, люблю тебя :)
Создайте модель для таблицы 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;
}
}
значит поставить другую таблицу между ответом и вопросами?
нет, вам просто нужно создать модель для стола question_survey. У вас уже есть эта таблица
Я думаю, вам не нужен survey_id в таблице вопросов
Я пробую этот подход, но мастер не видит, что класс QuestionSurvey :: find (1) в основном будет показывать идентификатор в question_survey, но он не
вы создали модель QuestionSurvey?
да создаю и ставлю защищенный $ table = "question_survey"
однако у него есть другие ошибки, попробуйте использовать другой подход
@ammar принятый ответ неверен, потому что question_survey_id принадлежит первичному ключу таблицы question_survey, тогда как он может иметь отношение к таблице ответов с этим полем
Demonowh я пробую его решение, оно работает, но немного займет больше места, верно?
ты пробовал мое решение? Это с вашей существующей структурой таблицы, за исключением удаления survey_id из таблицы вопросов
он работает отлично, но я изменил код, чтобы соответствовать отношениям
Лучший подход к отношениям
this way you won't repeat questions for each survey in case you have two same questions with two different surveys.
Модели
Опрос
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
tbl_questions
tbl_survey_questions
tbl_answers
tbl_users
Надеюсь, ты знаешь, что делать дальше ...
Я попробую этот подход, дам вам знать как можно скорее.
вопрос hasMany ответ, но с предложением where .. так что он получит ответы только из одного опроса ..
этот подход работает хорошо, но он будет использовать некоторое пространство, потому что он будет дублировать, хотя хорошие решения, кстати,
вопросы о взаимоотношениях и опросы находятся в сводной таблице question_survey, он работает, также как пользователи и ответы, он тоже работает, но как связать пользователей с вопросами с помощью question_survey_id